task: ACM証明書の作成¶
作業の目的 [why]¶
ホスト名"<ホスト名>.<ドメイン名>"で利用する証明書を作成します。
完了条件/事前条件 [設計者用情報]
完了条件 [after]
主処理は、以下を満たしたときに成功したものとします。
- 完了条件1
- ホスト名"<ホスト名>.<ドメイン名>"で利用する証明書が存在する。
事前条件 [before]
主処理の実施は、以下の状態であることを前提とします。
- 事前条件1
- ホスト名"<ホスト名>.<ドメイン名>"で利用する証明書が存在しない。
- 事前条件2
- 次のいずれかのアドレスでメールを受信できること。(whoisに登録のメールアドレス / admin@<ドメイン名> / administrator@ <ドメイン名> / hostmaster@ <ドメイン名> / postmaster@ <ドメイン名> / webmaster@ <ドメイン名>)
前提と異なることが判明した場合、直ちに処理を中止します。
作業対象 [what]¶
- ACMサービス
標準時間¶
8分
前提条件¶
作業環境条件 [where]¶
本作業は、以下の作業環境で行います。
作業環境条件1: OSとバージョン
Amazon Linuxの以下のバージョンで動作確認済
コマンド:
cat /etc/issue | head -1
結果(例):
Amazon Linux AMI release 2016.09
作業環境条件2: シェルとバージョン
bashの以下のバージョンで動作確認済
コマンド:
bash --version -v | head -1
結果(例):
GNU bash, バージョン 4.2.46(1)-release (x86_64-redhat-linux-gnu)
作業環境条件3: AWS CLIのバージョン
以下のバージョンで動作確認済
- AWS CLI 1.11.117
コマンド:
aws --version
結果(例):
aws-cli/1.11.166 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.7.24
バージョンが古い場合は最新版に更新しましょう。
コマンド:
sudo -H pip install -U awscli
開始条件¶
作業に必要なモノ・情報 [resource]¶
作業開始には、以下が全て揃っていることが必要です。
リソース1: ドメイン名
- 証明書を利用するドメイン名です。
- 今回は"<ドメイン名>"とします。
リソース2: ホスト名
- 証明書を利用するホスト名です。
- 今回は"<ホスト名>.<ドメイン名>"とします。
タスクの実行¶
0. パラメータの指定¶
まず変数の確認をします。
変数の確認:
cat << ETX 0.a. AWS_DEFAULT_PROFILE: actual: ${AWS_DEFAULT_PROFILE} expect: <ACMのフル権限が許可されているプロファイル> 0.b. AWS_DEFAULT_REGION: actual: ${AWS_DEFAULT_REGION} expect: us-east-1 0.1. DOMAIN_NAME: actual: ${DOMAIN_NAME} expect: <ドメイン名> 0.2. ACM_ALTER_NAME: actual: ${ACM_ALTER_NAME} expect: <ホスト名>.<ドメイン名> ETX
変数が入っていない、適切でない場合は、それぞれの手順番号について作業を行います。
0.a. プロファイルの指定¶
プロファイルの一覧を確認します。
コマンド:
cat ~/.aws/credentials \ | grep '\[' \ | sed 's/\[//g' | sed 's/\]//g'
結果(例):
iamFull-prjz-mbpr13 <ACMのフル権限が許可されているプロファイル>
変数の設定:
export AWS_DEFAULT_PROFILE='<ACMのフル権限が許可されているプロファイル>'
0.2. ホスト名の指定¶
ホスト名を指定します。
変数の設定:
ACM_ALTER_NAME="<ホスト名>.${DOMAIN_NAME}" \ && echo ${ACM_ALTER_NAME}
結果(例):
<ホスト名>.<ドメイン名>
再確認¶
設定されている変数の内容を再確認します。
変数の確認:
cat << ETX 0.a. AWS_DEFAULT_PROFILE: actual: ${AWS_DEFAULT_PROFILE} expect: <ACMのフル権限が許可されているプロファイル> 0.b. AWS_DEFAULT_REGION: actual: ${AWS_DEFAULT_REGION} expect: us-east-1 0.1. DOMAIN_NAME: actual: ${DOMAIN_NAME} expect: <ドメイン名> 0.2. ACM_ALTER_NAME: actual: ${ACM_ALTER_NAME} expect: <ホスト名>.<ドメイン名> ETX
1. 前処理¶
処理対象の状態確認¶
主処理の実施は、以下の状態であることを前提とします。
前提と異なることが判明した場合、直ちに処理を中止します。
事前条件1: ホスト名"<ホスト名>.<ドメイン名>"で利用する証明書が存在しない。
「ホスト名"<ホスト名>.<ドメイン名>"で利用する証明書が存在しない。」ことを確認します。
コマンド:
aws acm list-certificates \ --query "CertificateSummaryList[?DomainName == \`${DOMAIN_NAME}\`].DomainName"
結果(例):
[]
事前条件2: 次のいずれかのアドレスでメールを受信できること。(whoisに登録のメールアドレス / admin@<ドメイン名> / administrator@ <ドメイン名> / hostmaster@ <ドメイン名> / postmaster@ <ドメイン名> / webmaster@ <ドメイン名>)
「次のいずれかのアドレスでメールを受信できること。(whoisに登録のメールアドレス / admin@<ドメイン名> / administrator@ <ドメイン名> / hostmaster@ <ドメイン名> / postmaster@ <ドメイン名> / webmaster@ <ドメイン名>)」ことを確認します。
2. 主処理¶
ACM識別子の作成¶
変数の確認:
cat << ETX DOMAIN_NAME: actual: ${DOMAIN_NAME} expect: <ドメイン名> ACM_ALTER_NAME: actual: ${ACM_ALTER_NAME} expect: <ホスト名>.<ドメイン名> ETX
コマンド:
aws acm request-certificate \ --domain-name ${DOMAIN_NAME} \ --subject-alternative-names ${ACM_ALTER_NAME}
結果(例):
{ "CertificateArn": "arn:aws:acm:us-east-1:<AWSID 12桁>:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
3. 後処理¶
3.1. 完了条件の確認¶
主処理は、以下を満たしたときに成功したものとします。
完了条件1: ホスト名"<ホスト名>.<ドメイン名>"で利用する証明書が存在する。
「ホスト名"<ホスト名>.<ドメイン名>"で利用する証明書が存在する。」ことを確認します。
コマンド:
aws acm list-certificates \ --query "CertificateSummaryList[?DomainName == \`${DOMAIN_NAME}\`].DomainName"
結果(例):
[ "<ドメイン名>" ]
3.2. ステータスの確認¶
ARNの取得
コマンド:
ACM_CERT_ARN=$( \ aws acm list-certificates \ --query "CertificateSummaryList[?DomainName == \`${DOMAIN_NAME}\`].CertificateArn" \ --output text \ ) \ && echo ${ACM_CERT_ARN}
結果(例):
arn:aws:acm:us-east-1:<AWSID 12桁>:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ステータスの確認
コマンド:
ACM_CERT_STATUS=$( \ aws acm describe-certificate \ --certificate-arn ${ACM_CERT_ARN} \ --query 'Certificate.Status' \ --output text \ ) \ && echo ${ACM_CERT_STATUS}
結果(例):
PENDING_VALIDATION
3.3. 証明書作成の承認¶
証明書作成の承認
SESで受信している場合、SES受信用のS3バケット名を指定します。
変数の設定:
S3_BUCKET_NAME='<S3バケット名>'
コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/ \ |grep $(date +%Y-%m-%d)
結果(例):
2017-10-09 01:23:45 11176 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2017-10-09 01:23:45 11148 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ファイルサイズの小さい方をダウンロードする。
変数の設定:
FILE_DOWNLOAD='<ファイル名>'
コマンド:
aws s3 cp s3://${S3_BUCKET_NAME}/${FILE_DOWNLOAD} .
結果(例):
download: s3://<S3バケット名>/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx to ./xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
コマンド:
cat ${FILE_DOWNLOAD} \ | grep ^https://${AWS_DEFAULT_REGION}.certificates.amazon.com
結果(例):
https://us-east-1.certificates.amazon.com/approvals?code=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&context=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ブラウザでURLにアクセスします。
- 'I Approve'ボタンをクリックします。
- 'Success!'と表示されます。
ステータスの確認
コマンド:
ACM_CERT_STATUS=$( \ aws acm describe-certificate \ --certificate-arn ${ACM_CERT_ARN} \ --query 'Certificate.Status' \ --output text \ ) \ && echo ${ACM_CERT_STATUS}
結果(例):
ISSUED
参考¶
再送する場合¶
変数の確認:
cat << ETX ACM_CERT_ARN: actual: ${ACM_CERT_ARN} expect: arn:aws:acm:us-east-1:<AWSID 12桁>:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ACM_ALTER_NAME: actual: ${ACM_ALTER_NAME} expect: <ホスト名>.<ドメイン名> DOMAIN_NAME: actual: ${DOMAIN_NAME} expect: <ドメイン名> ETX
コマンド:
aws acm resend-validation-email \ --certificate-arn ${ACM_CERT_ARN} \ --domain ${ACM_ALTER_NAME} \ --validation-domain ${DOMAIN_NAME}
結果(例):
(yet)