皆様こんにちは。
今回は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.フロー図
今回のACMを利用してのhttps設定方法は以下になります。
- ACMより証明書の発行をします。
- Route53にCNAMEレコードを作成してドメインの検証をします。
- ALBで発行した証明書を選択し、HTTPSリスナーの追加をします。
- 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プラグインを導入します。
①ダッシュボードからプラグインの「新規追加」をクリック。
②「https」と検索して表示される、「Really Simple SSL」プラグインをインストール。
③「有効化」をクリック。
④「SSLを有効化」をクリック。
⑤必要な情報を入力し再度ログイン。
⑥https接続できていることを確認できました。
これで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のダッシュボードに移動しページを表示しておきます。
②片方の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キー」でリロードします。
再度問題なく表示することができました。
これで検証を終わります。
7.感想
今回はACMをリクエストし、httpsの設定をすることができました。
次回もよろしくお願いします。
8.参照
AWS CLI Command Reference
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/acm/index.html