task: ACM証明書の作成

作業の目的 [why]

ホスト名"<ホスト名>.<ドメイン名>"で利用する証明書を作成します。

完了条件/事前条件 [設計者用情報]

完了条件 [after]

主処理は、以下を満たしたときに成功したものとします。

完了条件1
ホスト名"<ホスト名>.<ドメイン名>"で利用する証明書が存在する。

事前条件 [before]

主処理の実施は、以下の状態であることを前提とします。

事前条件1
ホスト名"<ホスト名>.<ドメイン名>"で利用する証明書が存在しない。
事前条件2
次のいずれかのアドレスでメールを受信できること。(whoisに登録のメールアドレス / admin@<ドメイン名> / administrator@ <ドメイン名> / hostmaster@ <ドメイン名> / postmaster@ <ドメイン名> / webmaster@ <ドメイン名>)

前提と異なることが判明した場合、直ちに処理を中止します。

作業対象 [what]

  • ACMサービス

標準時間

8分

前提条件

作業権限条件 [who]

本作業は、以下の作業権限を有する人が行います。

作業権限条件: ACMへの権限

Certificate Managerに対してフル権限があること。

作業環境条件 [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: ホスト名

  • 証明書を利用するホスト名です。
  • 今回は"<ホスト名>.<ドメイン名>"とします。

作業開始 [when]

以下を全て満たしているとき、作業を開始します。

  • 開始の指示があった場合。

タスクの実行

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.b. リージョンの指定

変数の設定

export AWS_DEFAULT_REGION='us-east-1'

0.1. ドメイン名の指定

ドメイン名を指定します。

変数の設定:

DOMAIN_NAME='<ドメイン名>'

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)

完了