皆様こんにちは。
今回はCLIを利用して高可用性アーキテクトの構築をしていきます。
この記事ではCLIよりACMを利用してhttpsの設定を行います。
このブログはCLIによる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.証明書発行

httpsでアクセスできるようにするため、ACMを利用して証明書を発行しましょう。
発行のため、[aws acm request-certificate]コマンドを使用します。
※ ドメイン名はreocrd.domain.comのような形で入力します。

使用するオプション 設定値 説明
--domain-name [ドメイン名] 前回作成したものを入力します
--validation-method DNS DNSによる認証を指定します
--tags Key=Name,Value=umemoto-ACM 設定したいタグを入力

入力

aws acm request-certificate `
    --domain-name [ドメイン名] `
    --validation-method DNS --tags Key=Name,Value=umemoto-ACM

出力

{
    "CertificateArn": "arn:aws:acm:ap-northeast-2:xxxxx:certificate/xxxxx-xxxx-xxxx-xxxxx"
}

証明書の発行ができました。

証明書の詳細は[aws acm describe-certificate]コマンドで確認できます。

使用するオプション 設定値 説明
--certificate-arn "arn:aws:acm:ap-northeast-2:xxxxx:certificate/xxxxx-xxxx-xxxx-xxxxx"  証明書のARNを入力します

入力

aws acm describe-certificate `
    --certificate-arn arn:aws:acm:ap-northeast-2:xxxxx:certificate/xxxxx-xxxx-xxxx-xxxx-xxxxx
{
    "Certificate": {
        "CertificateArn": "arn:aws:acm:ap-northeast-2:xxxxx:certificate/xxxxx-xxxx-xxxx-xxxx-xxxxx",
        "DomainName": "[ドメイン名]",
        "SubjectAlternativeNames": [
            "[ドメイン名]"
        ],
        "DomainValidationOptions": [
            {
                "DomainName": "[ドメイン名]",
                "ValidationDomain": "[ドメイン名]",
                "ValidationStatus": "PENDING_VALIDATION",
                "ResourceRecord": {
                    "Name": "xxxxx",
                    "Type": "CNAME",
                    "Value": "xxxxx.acm-validations.aws."
                },
                "ValidationMethod": "DNS"
            }
        ],
        "Subject": "CN=[ドメイン名]",
        "Issuer": "Amazon",
        "CreatedAt": "2022-05-16T10:46:01.693000+09:00",
        "Status": "PENDING_VALIDATION",
        "KeyAlgorithm": "RSA-2048",
        "SignatureAlgorithm": "SHA256WITHRSA",
        "InUseBy": [],
        "Type": "AMAZON_ISSUED",
        "KeyUsages": [],
        "ExtendedKeyUsages": [],
        "RenewalEligibility": "INELIGIBLE",
        "Options": {
            "CertificateTransparencyLoggingPreference": "ENABLED"
        }
    }
}

発行した証明書の詳細を確認できました。

5.https設定

5-1.レコード作成

次に発行した証明書をDNSで検証するため、Route53に新しいレコードを作成します。

今回もレコード作成の前にjson形式でレコードセットの作成を以下のようにします。

ファイル名:record-setting-2.json
{
     "Comment": "Creating record sets in Route 53",
     "Changes": [{
                "Action": "CREATE",
                "ResourceRecordSet": {
                            "Name": "[証明書のName]",
                            "Type": "CNAME",
                            "TTL": 300,
                            "ResourceRecords": [{
                                    "Value": "[証明書のValue]"
                              }]}
                          }]
}
  • Comment:レコードの説明を記述しています。
  • Changes:変更内容です。
  • Action:変更の種類を指定します。今回は新しいレコードを作成するのでCREATEを指定します。
  • ResourceRecordSet:作成、削除、または更新するために設定されたリソースレコードに関する情報です。
  • Name:発行した証明書のNameを入力。
  • Type:レコードタイプを指定します。証明書の検証をする場合はCNAMEレコードを指定します。
  • TTL:リソースレコードのキャッシュ存続時間を設定しています。
  • ResourceRecords: 実行するリソースレコードに関する情報。
  • Value:発行した証明書のValueを入力。

レコードを作成するため、[aws route53 change-resource-record-sets]コマンドを使用します。

使用するオプション 設定値 説明
--hosted-zone-id xxxxx ホストゾーンのIDを入力
--change-batch file://C:\route53\record-setting-2.json 先ほど作成したレコードセットのパスを指定

入力

aws route53 change-resource-record-sets `
    --hosted-zone-id xxxxx `
    --change-batch file://C:\route53\record-setting-2.json

出力

{
    "ChangeInfo": {
        "Id": "/change/xxxxx",
        "Status": "PENDING",
        "SubmittedAt": "2022-05-16T02:25:38.113000+00:00",
        "Comment": "Creating record sets in Route 53"
    }
}

証明書のレコードの追加ができました。

5-2.HTTPSリスナー追加

次にALBにhttpsのリスナーの追加を行います。

リスナーの追加のために、[aws elbv2 create-listener]コマンドを使用します。

使用するオプション 設定値 説明
--load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-2:xxxxx:loadbalancer/app/umemoto-ALB/xxxxx  ALBのARNを指定
--protocol HTTPS プロトコルを指定
--port 443 ポート番号を入力
--certificates CertificateArn=arn:aws:acm:ap-northeast-2:xxxxx:certificate/xxxx-xxxx-xxxx-xxxx-xxxxx 証明書のARNを指定
--ssl-policy ELBSecurityPolicy-2016-08 SSLのversionを指定
--default-actions Type=forward,TargetGroupArn=
arn:aws:elasticloadbalancing:ap-northeast-2:xxxxx:targetgroup/umemoto-TGN/xxxxx 
TGNのARNを指定

入力

aws elbv2 create-listener `
    --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-2:xxxxx:loadbalancer/app/umemoto-ALB/xxxxx `
    --protocol HTTPS `
    --port 443 `
    --certificates CertificateArn=arn:aws:acm:ap-northeast-2:xxxxx:certificate/xxxxx `
    --ssl-policy ELBSecurityPolicy-2016-08 `
    --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-2:xxxxx:targetgroup/umemoto-TGN/xxxxx

出力

{
    "Listeners": [
        {
            "ListenerArn": "arn:aws:elasticloadbalancing:ap-northeast-2:xxxxx:listener/app/umemoto-ALB/xxxxx/xxxxx",
            "LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-2:xxx:loadbalancer/app/umemoto-ALB/xxxxx",
            "Port": 443,
            "Protocol": "HTTPS",
            "Certificates": [
                {
                    "CertificateArn": "arn:aws:acm:ap-northeast-2:xxxxx:certificate/xxxxx"
                }
            ],
            "SslPolicy": "ELBSecurityPolicy-2016-08",
            "DefaultActions": [
                {
                    "Type": "forward",
                    "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-2:xxxxx:targetgroup/umemoto-TGN/xxxxx",
                    "ForwardConfig": {
                        "TargetGroups": [
                            {
                                "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-2:xxxxx:targetgroup/umemoto-TGN/xxxxx",
                                "Weight": 1
                            }
                        ],
                        "TargetGroupStickinessConfig": {
                            "Enabled": false
                        }
                    }
                }
            ]
        }
    ]
}

リスナーの追加ができました。

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

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

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

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

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

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

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

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

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

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

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

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

ALBから不要になったhttpのリスナーを削除します。
削除のため、[aws elbv2 delete-listener]コマンドを使用します。

使用するオプション 設定値 説明
--listener-arn arn:aws:elasticloadbalancing:ap-northeast-2:xxxxx:listener/app/umemoto-ALB/xxxxx/xxxxx  httpリスナーのARNを入力します

入力

aws elbv2 delete-listener `
    --listener-arn arn:aws:elasticloadbalancing:ap-northeast-2:xxxxx:listener/app/umemoto-ALB/xxxxx/xxxxx

出力はされないので[aws elbv2 describe-rules]コマンドで同じARNを指定してリスナーが見つからなければ削除できています

入力

aws elbv2 describe-rules `
    --listener-arn arn:aws:elasticloadbalancing:ap-northeast-2:xxxxx:listener/app/umemoto-ALB/xxxxx/xxxxx

出力

An error occurred (ListenerNotFound) when calling the DescribeRules operation: One or more listeners not found

同じARNを指定して見つからないため削除されているということが確認できました。

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

ALB用のセキュリティグループからhttpのものを削除していきます。
削除には、[aws ec2 revoke-security-group-ingress]コマンドを使用します。

使用するオプション 設定値 説明
--group-id sg-xxxxx ALB用のSGのIDを入力
--protocol tcp プロトコルを入力
--port 80 HTTPのポート番号を入力
--cidr 0.0.0.0/0 指定していたCIDRの範囲を入力

入力

aws ec2 revoke-security-group-ingress `
    --group-id sg-xxxxx `
    --protocol tcp `
    --port 80 `
    --cidr 0.0.0.0/0

出力

{
    "Return": true
}

削除を確認できました。

6.検証

ここまでできたらいったんALBの検証に入ります。
現在ALBを利用して二台のEC2インスタンスを負荷分散しながら運用していますが、ここで片方のEC2インスタンスを停止させてもWordpressを正常に動作させ続けられるかの検証を行います。
作成時同様EC2インスタンスの操作はCLIで行います。

①まずWordpressのダッシュボードに移動しページを表示しておきます。
file
②片方のEC2インスタンスを停止するため以下のコマンドを使用します。

aws ec2 stop-instances --instance-ids [instance_id]

出力

{
    "StoppingInstances": [
        {
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "InstanceId": "i-xxxxx",
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}

③停止できたか、以下のコマンドを使用して確認します。

aws ec2 describe-instances --instance-ids i-xxxxx --query "Reservations[].Instances[].State[].{InstanceStatus:Name}"

出力

[
    {
        "InstanceStatus": "stopped"
    }
]

停止を確認できました。

④最後にダッシュボードのページを再表示してもエラーにならないか確認します。「F5キー」でリロードします。
file

再度問題なく表示することができました。
これで検証を終わります。

7.感想

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

8.参照

AWS CLI Command Reference
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/acm/index.html

Last modified: 2022-05-27

Author