ACM証明書を使用して、HTTPSで独自ドメインにアクセスする構成
以下のページで、Route 53で取得した独自ドメインを使って、ALBにアクセスする構成をご紹介しました。
ただし上記の構成では、SSL化されていないHTTP通信でのみアクセス可能です。そこで今回は、ACMで取得した証明書を使用して、HTTPSでアクセスできるように設定します。
構築する環境
基本的な構成は、先述ご紹介したページと同一です。今回はRoute 53で取得したドメイン(awstut.net)へのアクセスを、ACM証明書を使ってSSL化することを目的とします。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。以下のURLにCloudFormationテンプレートを配置してます。
https://github.com/awstut-an-r/awstut-fa/tree/main/023
テンプレートファイルのポイント解説
本ページでは、ACMやSSL化に関する解説のみを行います。プライベートサブネット内のEC2をALBにアタッチする方法や、Route 53に関しては、以下のページをご確認ください。
ACM証明書を取得する
fa-023-acm.yamlでACMリソースを定義しています。
Resources:
Certificate:
Type: AWS::CertificateManager::Certificate
Properties:
DomainName: !Ref DomainName
DomainValidationOptions:
- DomainName: !Ref DomainName
HostedZoneId: !Ref HostedZoneId
ValidationMethod: DNS
Code language: YAML (yaml)
DomainNameプロパティに、証明書を取得するドメイン名を設定します。今回は「awstut.net」を指定します。ACMで証明書を取得する場合、そのドメインの所有権を検証を経る必要があります。
Amazon 認証局 (CA) がサイトの証明書を発行する前に、 AWS Certificate Manager (ACM) は、ユーザーがリクエストで指定したすべてのドメイン名の所有者または管理者であることを証明する必要があります。所有権を証明するには、ドメインネームシステム (DNS) 検証を使用するか、証明書をリクエストした時点で E メール検証を使用することを選択できます。
一般的に、次の理由により、E メール検証よりも DNS 検証を使用することをお勧めします。
ドメインの所有権の検証
今回は推奨に従い、DNS検証を使用します。ValidationMethodプロパティに「DNS」を設定し、DNS検証を指定します。DomainValidationOptionsプロパティで、DNS検証に必要なパラメータを設定できます。DomainNameおよびHostedZoneIdプロパティで、関連づけるドメインの情報を設定します。「awstut.net」のドメイン名とホストゾーンIDとを指定します。
ALBに443番ポートでリッスンさせる
通信をSSL化するためのポイントはポート番号です。今回の構成では、下図の通りに通信が発生します。
ALBに443番ポートで待ち受けさせるためには、2点に気を付ける必要があります。
ALBのセキュリティグループ
1点目はALBに適用するセキュリティグループです。セキュリティグループはfa-023-vpc.yamlに定義しています。
Resources:
ALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: !Sub "${Prefix}-ALBSecurityGroup"
GroupDescription: Allow HTTPS Only.
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: !Ref HTTPSPort
ToPort: !Ref HTTPSPort
CidrIp: 0.0.0.0/0
Code language: YAML (yaml)
FromPortおよびToPortプロパティに「443」を設定します。これでHTTPS通信のみを許可するということになります。加えてCidrIpプロパティに「0.0.0.0/0」と設定することで、送信元を制限せず、インターネットからの通信を許可するということになります。
ALBリスナー
2点目はALBリスナーです。ALB関係のリソースはfa-023-alb.yamlに定義しています。
Resources:
ALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
Certificates:
- CertificateArn: !Ref Certificate
DefaultActions:
- TargetGroupArn: !Ref ALBTargetGroup
Type: forward
LoadBalancerArn: !Ref ALB
Port: !Ref HTTPSPort
Protocol: HTTPS
Code language: YAML (yaml)
Protocolプロパティを「HTTPS」を、Portプロパティに「443」を指定します。これでALBリスナーとしても、HTTPS通信を待ち受けることができるようになります。
ALBにACM証明書をアタッチする
改めてALBリスナーを確認します。
Resources:
ALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
Certificates:
- CertificateArn: !Ref Certificate
...
Code language: YAML (yaml)
ALBにACM証明書をアタッチするためには、Certificatesプロパティを設定します。先述の証明書のIDを指定します。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- インスタンス1のID:i-0e050ebec2df09db5
- インスタンス2のID:i-02470fc6eacfe5a6f
- ALBのID:fa-023-ALB
- Route 53のレコード:awstut.net
- ACM証明書のID:413e0700-093b-4783-9dee-575c9d345fe8
AWS Management Consoleからも、リソースの作成状況を確認します。まずRoute 53レコードの作成状況を確認します。
独自ドメイン「awstut.net」にALBが関連づいていることがわかります。次にACMを確認します。
「awstut.net」用の証明書が作成されていることが確認できます。Associated resourcesの項目を見ると、この証明書がALBに関連づいていることもわかります。続いてALBを確認します。
ALBリスナーを見ると、テンプレートで設定した通り、HTTPS(443)で受け付けることと、先述のACMがアタッチされていることがわかります。
ALBターゲットグループを見ると、作成した2つのEC2インスタンスが登録されていることがわかります。
HTTPSでALBにアクセスする
準備が整いましたので、ブラウザから、HTTPSで独自ドメインにアクセスします。
HTTPSでALBにアクセスすることができました。以上より、独自ドメインを使用したALBへのアクセスを、SSL化することができました。
まとめ
ACM証明書を使用して、ALBへのアクセスをSSL化する方法を確認しました。
HTTPSでALBにアクセスするためには、ALBのセキュリティグループおよびALBリスナーの設定に注意する必要があることを確認しました。