CLIによる「ACM」構築


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

皆様こんにちは。
今回は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.証明書発行

4-1.証明書のリクエスト

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"
        }
    }
}

リクエストした証明書の詳細を確認できました。
現段階だとドメインの所有権を検証していないためValidationStatus(検証状況)とStatus(証明書の状態)はPENDING_VALIDATION(保留中)です。

4-2.検証用のレコード作成

次にドメインの所有権を検証して証明書を発行するため、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"
    }
}

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

DNSより検証が行われ証明書が発行されたかの確認のため、再度[aws acm describe-certificate]コマンドで確認します。

使用するオプション 設定値 説明
--certificate-arn "arn:aws:acm:ap-northeast-2:xxxxx:certificate/xxxxx-xxxx-xxxx-xxxxx" 証明書のARNを入力します
--query "Certificate.[DomainValidationOptions[0].{ValidationStatus:ValidationStatus},{Status:Status}]" 検証結果と証明書の状態の値のみ抽出

入力

aws acm describe-certificate `
    --certificate-arn arn:aws:acm:ap-northeast-2:xxxx:certificate/37c49167-4cb9-4e28-90c1-d720d84f7eec `
    --query "Certificate.[DomainValidationOptions[0].{ValidationStatus:ValidationStatus},{Status:Status}]"

出力

[
    {
        "ValidationStatus": "SUCCESS"
    },
    {
        "Status": "ISSUED"
    }
]

ValidationStatus(検証結果)から検証が成功し、Status(証明書の状態)から発行済みになっていることを確認できました。

5.https設定

5-1.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-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のリスナーを削除します。
削除のため、[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-3-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.検証

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

6-1.疎通確認

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

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

Test-NetConnection umemoto-ALB-154690738.ap-northeast-2.elb.amazonaws.com -port 443

出力

ComputerName     : umemoto-ALB-154690738.ap-northeast-2.elb.amazonaws.com
RemoteAddress    : 15.165.22.190
RemotePort       : 443
InterfaceAlias   : Wi-Fi
SourceAddress    : 192.168.1.11
TcpTestSucceeded : True

成功しました。

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

Test-NetConnection umemoto-ALB-154690738.ap-northeast-2.elb.amazonaws.com -port 80

出力

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

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

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

7.感想

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

8.参照

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

Last modified: 2022-06-09

Author