皆様こんにちは。
今回はCloudFormationを利用して高可用性アーキテクトの構築をしていきます。
この記事ではCloudFormationよりACMを利用してhttpsの設定を行います。
このブログはCloudFormationによるACMを利用してhttpsの設定をする上での知識を記事としてまとめ再確認し、皆様と共有するため作成します。

1.高可用性アーキテクト構築目次

目次はこちら

2.ACMとは

AWS Certificate Manager (ACM) は、 ウェブサイトやアプリケーションを保護するパブリックおよびプライベート SSL/TLS X.509 証明書およびキーの作成、保存、更新に伴うAWS複雑さに対処します。統合 AWS サービスの証明書は、ACM で直接発行するか、サードパーティーの証明書を ACM 管理システムにインポートすることで提供できます。ACM 証明書は、単一のドメイン名、複数の特定のドメイン名、ワイルドカードドメイン、またはこれらの組み合わせを保護できます。
参照:AWS Certificate Manager とは?

今回はSSL/TLS証明書を発行しhttpsでアクセスできるようにしたいのでACMを利用します。

類似サービスとしてGCPの「Certificate Manager」、Azureの「App Service Certificates」等があげられます。

3.フロー図

file
今回のACMを利用してのhttps設定方法は以下になります。

  1. ACMより証明書のリクエストをします。
  2. Route53にCNAMEレコードを作成してドメインの検証をして、証明書を発行します。
  3. ALBで発行した証明書を選択し、HTTPSリスナーの追加をします。
  4. EC2内のWordpressにhttps設定をする上で必要なプラグインを導入します。

4.証明書発行

証明書発行の全体のソースコードは下記の通りです。
ファイル名「ut-ACM-CF」

AWSTemplateFormatVersion: "2010-09-09"
Resources:
#証明書作成
  CertificateResource:
    Type: AWS::CertificateManager::Certificate
    Properties:
      DomainName: !ImportValue ut-route53-name
      ValidationMethod: DNS
      DomainValidationOptions:
      #ドメイン検証用レコードを追加
        - DomainName: !ImportValue ut-route53-name
          HostedZoneId: "Z01000061EWXXK1FTAO6J"
      Tags:
      -
        Key: "Name"
        Value: "ut-ACM"

#Outputsセクション設定
Outputs:
  CertificateOutput1:
    Value: !Ref CertificateResource
    Export:
      Name: ut-acm-arn

証明書設定部分のソースコードとOutputsセクション部分のソースコードをそれぞれ説明していきます。

4-1.証明書の作成と発行

httpsでアクセスできるようにするため、ACMを利用して証明書を発行しましょう。

証明書設定のソースコードは下記の通りです。

#証明書作成
  CertificateResource:
    Type: AWS::CertificateManager::Certificate
    Properties:
      DomainName: !ImportValue ut-route53-name
      ValidationMethod: DNS
      DomainValidationOptions:
      #ドメイン検証用レコードを追加
        - DomainName: !ImportValue ut-route53-name
          HostedZoneId: "Z01000061EWXXK1FTAO6J"
      Tags:
      -
        Key: "Name"
        Value: "ut-ACM"

設定項目は下記の通りです。

使用するオプション 設定値 説明
DomainName ut-route53-name 証明書を発行するドメイン名を参照
ValidationMethod DNS ドメイン所有権の検証方法を選択
DomainValidationOptions DomainName: !ImportValue ut-route53-name
HostedZoneId: "Z01000061EWXXK1FTAO6J"
ドメイン名とホストゾーンIDを参照して検証用のCNAMEレコードを作成
Tags Key: "Name",Value: "ut-ACM" 設定したいタグを入力

これで証明書発行のソースコードの説明は以上です。

4-2.Outputsセクション設定

Outputsセクション設定のソースコードは下記の通りです。

#Outputsセクション設定
Outputs:
  CertificateOutput1:
    Value: !Ref CertificateResource
    Export:
      Name: ut-acm-arn

設定項目は下記の通りです。

使用するオプション 設定値 説明
Value !Ref CertificateResource 証明書のARNを参照
Name ut-acm-arn 設定した名前で出力

これでOutputsセクション設定のソースコードの説明は以上です。

5.https設定

5-1.HTTPSリスナー追加

次にALBにhttpsのリスナーの追加を行います。
「ut-ALB-CF」ファイルに以下のコードを追加します。

ListenerResource2:
    Type: "AWS::ElasticLoadBalancingV2::Listener"
    Properties:
      LoadBalancerArn: !Ref LoadBalancerResource
      Port: 443
      Protocol: "HTTPS"
      SslPolicy: "ELBSecurityPolicy-2016-08"
      Certificates: 
      - 
        CertificateArn: !ImportValue ut-acm-arn
      DefaultActions: 
      - 
        TargetGroupArn: !Ref TargetGroupResource
        Type: "forward"

設定項目は下記の通りです。

使用するオプション 設定値 説明
LoadBalancerArn !Ref LoadBalancerResource  ALBのARNを参照
Port 443 ポート番号を入力
Protocol HTTPS プロトコルを指定
SslPolicy ELBSecurityPolicy-2016-08 SSLポリシーのバージョン指定
Certificates CertificateArn: !ImportValue ut-acm-arn 証明書のARNを参照
DefaultActions TargetGroupArn: !Ref TargetGroupResource
Type: "forward"
TGNのARNを参照

これでhttpsリスナー追加のソースコードの説明は以上です。

5-2.Wordpress設定とプラグイン導入

5-2-1.Wordpress設定

次にWordpressの初期設定を行います。

http://自分のレコード名/wp-admin/install.phpにアクセスし、日本語を選択して「次へ」をクリック。
file

②「さあ、始めましょう!」をクリック。
file

③RDS作成時に設定した項目を入力し、「データベースのホスト名」にはRDSのエンドポイントを入力します。
file

④「インストール実行」をクリック。
file

⑤必要情報を入力して「インストール」をクリック。
file

⑥インストールに成功しました。
file

⑦最後にログインできるかの確認をしましょう。
file

⑧ログインできました!
file

これでWordpressの初期設定は終わりです。

5-2-2.Wordpressプラグイン導入

最後にWordpressにhttpsプラグインを導入します。

①ダッシュボードからプラグインの「新規追加」をクリック。
file

②「https」と検索して表示される、「Really Simple SSL」プラグインをインストール。
file

③「有効化」をクリック。
file

④「SSLを有効化」をクリック。
file

⑤必要な情報を入力し再度ログイン。
file

⑥https接続できていることを確認できました。
file

これでhttpsの設定は完了しました。

5-3.リスナーとセキュリティグループ変更

ALBから不要になったhttpのリスナーとセキュリティグループからhttpのものを削除していきます。

5-3-1.リスナー変更

ALBから不要になったhttpのリスナーを削除します。
「ut-ALB-CF」ファイルから以下のコードを削除します。

#リスナー作成
  ListenerResource:
    Type: "AWS::ElasticLoadBalancingV2::Listener"
    Properties:
      LoadBalancerArn: !Ref LoadBalancerResource
      Port: 80
      Protocol: "HTTP"
      DefaultActions: 
      - 
        TargetGroupArn: !Ref TargetGroupResource
        Type: "forward"

ALBから不要になったhttpのリスナールールを削除しました。

5-3-2.セキュリティグループ変更

ALB用のセキュリティグループからhttpのものを削除していきます。
「hebiishi-SG-CF」ファイルから以下のコードを削除します。

- IpProtocol: tcp 
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

セキュリティグループからhttpのインバウンドルールを削除しました。

6.検証

ここまでできたら疎通確認の検証に入ります。

6-1.疎通確認

ALBはHTTPS通信は受け入れているため成功しますが、HTTPによる通信は設定を削除したため失敗するはずです。ローカルのPowerShellを利用して検証します。

①まずPowerShellで以下のコマンドを利用してHTTPSの疎通を確認します。

Test-NetConnection ut-ALB-878921977.ap-northeast-2.elb.amazonaws.com -port 443

出力

ComputerName     : ut-ALB-878921977.ap-northeast-2.elb.amazonaws.com
RemoteAddress    : 13.209.120.244
RemotePort       : 443
InterfaceAlias   : Wi-Fi
SourceAddress    : 192.168.1.11
TcpTestSucceeded : True

成功しました。

①次にPowerShellで以下のコマンドを利用してHTTPの疎通を確認します。

Test-NetConnection ut-ALB-878921977.ap-northeast-2.elb.amazonaws.com -port 80

出力

ComputerName           : ut-ALB-878921977.ap-northeast-2.elb.amazonaws.com
RemoteAddress          : 13.209.120.244
RemotePort             : 80
InterfaceAlias         : Wi-Fi
SourceAddress          : 192.168.1.11
PingSucceeded          : False
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : False

予想通りHTTPによる通信は失敗しました。

これで疎通確認を終わります。

7.感想

今回はACMをリクエストし、httpsの設定をすることができました。
次回もよろしくお願いします。

8.参照

AWS CloudFormation – AWS::CertificateManager::Certificate
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-certificate.html

Last modified: 2022-06-22

Author