Elastic Beanstalk 環境のために HTTPS を設定するにはどうすればよいですか?
最終更新日: 2022 年 8 月 23 日
ロードバランサーから Amazon Elastic Compute Cloud (Amazon EC2) インスタンスへのデータを暗号化できるように、AWS Elastic Beanstalk 環境のために HTTPS を設定したいと考えています。
簡単な説明
Elastic Beanstalk 環境用にカスタムドメイン名を購入して設定した場合は、HTTPS を使用してユーザーがウェブサイトにセキュアな方法で接続できるようにすることができます。ドメイン名を所有していない場合でも、開発およびテスト目的のために、自己署名証明書を使って HTTPS を使用できます。
サーバー証明書のプログラム的なプロビジョニング、管理、およびデプロイメントに推奨されるツールは、AWS Certificate Manager (ACM) です。また、AWS コマンドラインインターフェイス (AWS CLI) を使用することも可能です。お使いの AWS リージョンで ACM を利用できない場合は、AWS CLI を使用してサードパーティーまたは自己署名の証明書とプライベートキーを AWS Identity and Access Management (IAM) にアップロードできます。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
解決方法
Elastic Beanstalk 環境を準備する
1. Elastic Beanstalk 環境にトラフィックをルーティングするには、Amazon Route 53 または別のドメインプロバイダーを使用して新しいドメインを登録します。
2. 環境の URL に AWS リージョンが含まれている場合は、エイリアス名を作成します。または、環境の URL に AWS リージョンが含まれていない場合は、CNAME レコードを作成します。
重要: CNAME レコードは、2016 年より前に作成された環境に使用できます。Zone Apex ドメイン (ルートドメインまたはネイキッドドメインとも呼ばれます) で CNAME レコードを使用することはできません。詳細については、「エイリアスレコードと非エイリアスレコードの選択」を参照してください。
3. ACM で証明書を作成するか、サードパーティーまたは自己署名証明書とプライベートキーを IAM にアップロードします。
ロードバランサーにリスナーを追加する
1. Elastic Beanstalk コンソールを開き、環境を選択します。
2. ナビゲーションペインで、[Configuration] (設定) をクリックします。
3. [Load balancer] (ロードバランサー) カテゴリで、[Modify] (変更) を選択します。
4. ポート 443 にリスナーを追加するには、Elastic Beanstalk 環境内のロードバランサーのタイプに基づいて、次の一連の手順のいずれかを選択します。
Classic Load Balancer のリスナーを追加します。
1. [リスナーを追加] を選択します。
2. [ポート] には、着信トラフィックポート (通常は 443) を入力します。
3. [プロトコル] には、[HTTPS] を選択します。
4. [インスタンスポート] には、80 と入力します。
5. [インスタンスプロトコル] には、[HTTP] を選択します。
6. [SSL 証明書] では、証明書を選択し、ドロップダウンメニューから使用する [SSL ポリシー] を選択します。
7. [Add] (追加) を選択してから、[Apply] (適用) を選択します。
Application Load Balancer のリスナーを追加します。
1. [リスナーを追加] を選択します。
2. [ポート] には、着信トラフィックポート (通常は 443) を入力します。
3. [プロトコル] には、[HTTPS] を選択します。
4. [SSL certificate] (SSL 証明書) では、証明書を選択し、ドロップダウンリストから使用する [SSL policy] (SSL ポリシー) を選択します。
5. [Add] (追加) を選択してから、[Apply] (適用) を選択します。
Network Load Balancer のリスナーを追加します。
1. [リスナーを追加] を選択します。
2. [ポート] には、着信トラフィックポート (通常は 443) を入力します。
3. [Add] (追加) を選択してから、[Apply] (適用) を選択します。
HTTPS 接続を終了するようにインスタンスを設定する
HTTPS 接続を終了するようにインスタンスを設定するには、設定ファイルを使用して、インスタンスで実行されているソフトウェアを変更します。セキュリティで保護された接続を許可するように、設定ファイルを使用してセキュリティグループを変更する必要もあります。
重要: シングルインスタンス環境を使用している場合は、次の手順を省略してください。その後、シングルインスタンス環境のインスタンス (エンドツーエンド HTTPS) で HTTPS を終了するのセクションの手順を実行します。
1. Elastic Beanstalk 環境内のロードバランサーのタイプに基づいて、以下の設定ファイルのいずれかを使用してロードバランサーにセキュアリスナーを追加します。
Classic Load Balancer については、.ebextensions/https-reencrypt-clb.config ファイルを使用します。
option_settings:
aws:elb:listener:443:
InstancePort: 443
InstanceProtocol: HTTPS
aws:elasticbeanstalk:application:
Application Healthcheck URL: HTTPS:443/
Application Load Balancer には、.ebextensions/https-reencrypt-alb.config ファイルを使用します。
option_settings:
aws:elbv2:listener:443:
DefaultProcess: https
ListenerEnabled: 'true'
Protocol: HTTPS
aws:elasticbeanstalk:environment:process:https:
Port: '443'
Protocol: HTTPS
Network Load Balancer には、.ebextensions/https-reencrypt-nlb.config ファイルを使用します。
option_settings:
aws:elbv2:listener:443:
DefaultProcess: https
ListenerEnabled: 'true'
aws:elasticbeanstalk:environment:process:https:
Port: '443'
2. ポート 443 でトラフィックを受信するようにロードバランサーを更新します。
新しいセキュリティグループを作成し、Elastic Beanstalk がそのセキュリティグループを使用してポート 443 でトラフィックを受信できるようにします。例えば、次の .ebextensions/https-lbsecuritygroup.config ファイルはセキュリティグループを作成し、そのセキュリティグループをロードバランサーにアタッチします。
option_settings:
# Use the custom security group for the load balancer
aws:elb:loadbalancer:
SecurityGroups: '`{ "Ref" : "loadbalancersg" }`'
ManagedSecurityGroup: '`{ "Ref" : "loadbalancersg" }`'
Resources:
loadbalancersg:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: load balancer security group
VpcId: vpc-#######
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
SecurityGroupEgress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
上記の設定ファイルで、VpcId をご使用の環境の正しい値に置き換えます。
注: 上記の例には、HTTP 接続を許可するためのポート 80 を介した入出力が含まれています。安全な接続のみを許可するには、SecurityGroupIngress セクションでポート 80 の設定を削除します。
3. ロードバランサーのセキュリティグループとインスタンスのセキュリティグループ間のポート 443 経由の通信を許可するイングレスルールとエグレスルールを追加します。
例えば、次の .ebextensions/https-backendsecurity.config ファイルを使用できます。
Resources:
# Add 443-inbound to instance security group (AWSEBSecurityGroup)
httpsFromLoadBalancerSG:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
IpProtocol: tcp
ToPort: 443
FromPort: 443
SourceSecurityGroupId: {"Fn::GetAtt" : ["loadbalancersg", "GroupId"]}
# Add 443-outbound to load balancer security group (loadbalancersg)
httpsToBackendInstances:
Type: AWS::EC2::SecurityGroupEgress
Properties:
GroupId: {"Fn::GetAtt" : ["loadbalancersg", "GroupId"]}
IpProtocol: tcp
ToPort: 443
FromPort: 443
DestinationSecurityGroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
これで、HTTPS を使用してバックエンドインスタンスにロードバランサーがセキュアに接続されるようになりました。ロードバランサーは、証明書が自己署名証明書であるか、信頼できる認証局から発行されたものであるかを問わず、インスタンスからのすべての証明書を受け入れます。
注: ロードバランサーには、特定の証明書のみを信頼するようにロードバランサーに指示するポリシーを追加できます。例えば、次の .ebextensions/https-backendauth.config ファイルは 2 つのポリシーを作成します。一方のポリシーはパブリック証明書を指定し、もう一方のポリシーはインスタンスポート 443 への接続にはその証明書のみを信頼するようにロードバランサーに指示します。
option_settings:
# Backend Encryption Policy
aws:elb:policies:backendencryption:
PublicKeyPolicyNames: backendkey
InstancePorts: 443
# Public Key Policy
aws:elb:policies:backendkey:
PublicKey: |
-----BEGIN CERTIFICATE-----
################################################################
################################################################
################################################################
################################################################
################################################
-----END CERTIFICATE-----
4. インスタンスで実行されるプロキシサーバーを設定して、HTTPS を終了します。
注意: 設定は、ソリューションスタックに応じて異なります。ソリューションスタックの .ebextensions は、.ebextensions にプライベートキーとサーバー証明書の値をハードコーディングします。これらのファイルをさらにセキュア化するには、Amazon Simple Storage Service (Amazon S3) にコンテンツをアップロードし、S3Auth を使用してそれらを Amazon EC2 にプルすることができます。
5. 環境に設定ファイルをデプロイするには、アプリケーションバンドルのルートにある .ebextensions という名前のディレクトリに設定ファイルを追加します。その後、これらの設定ファイルが含まれるソースコードをデプロイします。
単一インスタンス環境でインスタンスの HTTP (エンドツーエンド HTTPS) を終了する
1. Elastic Beanstalk アプリケーションが実行されている EC2 インスタンスへのポート 443 の着信トラフィックを許可します。
次の例では、.ebextensions を使用して、ポート 443 での着信トラフィックを許可します。
Resources:
sslSecurityGroupIngress:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
IpProtocol: tcp
ToPort: 443
FromPort: 443
CidrIp: 0.0.0.0/0
2. インスタンスで実行されるプロキシサーバーを設定して、HTTPS を終了します。
注意: 設定は、ソリューションスタックに応じて異なります。ソリューションスタックの .ebextensions は、.ebextensions にプライベートキーとサーバー証明書の値をハードコーディングします。これらのファイルをさらにセキュア化するには、S3 にコンテンツをアップロードし、S3Auth を使用してそれらを Amazon EC2 にプルすることができます。
3. 環境に設定ファイルをデプロイするには、アプリケーションバンドルのルートにある .ebextensions という名前のディレクトリに設定ファイルを追加します。その後、これらの設定ファイルが含まれるソースコードをデプロイします。