どうもこんにちは。
今回は、ElasticBeanstalkで運用しているRailsアプリケーションから、SecretsManagerに配置しているSSL証明書をダウンロードしてconfigディレクトリに配置する方法を紹介します。
前提条件
- ローカル環境で証明書の検証が完了していること
- ローカル環境の任意のディレクトリに
sample_client.crtとsample_client.keyの2つの証明書が配置されていること- 今回の記事では、
./config/certディレクトリに配置しているものとして説明しています
- 今回の記事では、
-
ElasticBeanstalk環境の環境変数にSAMPLE_API_CERT_SECRET: <SecretsManagerの名前>を設定しておくこと -
ElasticBeanstalk環境からSecretsManagerの値を読み取るIAMポリシーを作成してアタッチしていること -
AWS CLIを使用可能な状態であること -
EBコマンドを使用可能な状態であること
- 環境変数の設定例
SAMPLE_API_CERT_SECRET: sample-certificates
- IAMポリシーの例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:secretsmanager:ap-northeast-1:YOUR_ACCOUNT_ID:secret:sample-certificates"
]
}
]
}
手順
1. SecretsManagerに配置する
1-1. 証明書を変換する
ターミナルで以下を実行します。
% CERT_BASE64=$(base64 -i config/certs/sample_api_client.crt)
% KEY_BASE64=$(base64 -i config/certs/sample_api_client.key)
1-2. JSONファイルを作成
ターミナルで以下を実行します。
% cat > sample-api-certs.json <<EOF
{
"CLIENT_CERT": "$CERT_BASE64",
"CLIENT_KEY": "$KEY_BASE64"
}
EOF
1-3. AWS CLIでSecretsManagerを作成
ターミナルで以下を実行します。
% aws secretsmanager create-secret \
--name sample-certificates \
--description "Sample API client certificates" \
--secret-string file://sample-api-certs.json \
--region ap-northeast-1
AWSマネジメントコンソール上で作成していただいても構いません。ただし、証明書の内容を変換したものをValueに設定するようにしてください。
また、Keyは大文字にしてください。(小文字でも良いですが、以降の記事では大文字を前提としています。)
1-4. (セキュリティ対策)
以下は削除しておきましょう。
% rm sample-api-certs.json
2. ebextensions作成
2-1. .ebextensions ディレクトリにファイルを作成
.ebextensionsディレクトリが存在しない場合には、以下のコマンドで作成しておいてください。
% mkdir -p .ebextensions
ディレクトリが存在することを確認したら、以下のコマンドでファイルを作成します。
% touch 01_sample_api_client_certificate.config # Windowsの方は`ni`コマンド?
2-2. スクリプトコードを記述
# Sample API クライアント証明書の配置設定
# AWS Secrets Manager から証明書を取得し、config/certs/ に配置します
packages:
yum:
jq: []
container_commands:
# 保存先ディレクトリ
01_create_certs_directory:
command: "mkdir -p config/certs"
# SecretsManagerから`CLIENT_CERT`のValueを取得して、`config/certs/sample_api_client.crt`に配置
02_fetch_client_cert:
# `$SAMPLE_API_CERT_SECRET` でElasticBeanstalkに設定されている環境変数の値を読み取る
command: "aws secretsmanager get-secret-value --secret-id $SAMPLE_API_CERT_SECRET --region ap-northeast-1 --query SecretString --output text | jq -r '.CLIENT_CERT' | base64 -d > config/certs/sample_api_client.crt"
# SecretsManagerから`CLIENT_KEY`のValueを取得して、`config/certs/sample_api_client.key`に配置
03_fetch_client_key:
command: "aws secretsmanager get-secret-value --secret-id $SAMPLE_API_CERT_SECRET --region ap-northeast-1 --query SecretString --output text | jq -r '.CLIENT_KEY' | base64 -d > config/certs/sample_api_client.key"
# それぞれの証明書ファイルに対する権限を付与
04_set_permissions:
command: |
chmod 644 config/certs/sample_api_client.crt
chmod 600 config/certs/sample_api_client.key
chown webapp:webapp config/certs/sample_api_client.*
3. コミットしてデプロイ
ターミナルで以下を実行します。
% git add .ebextensions/01_sample_api_client_certificate.config
% git commit -m "<コミットメッセージ>"
(pushはお任せします)
% eb use <ElasticBeanstalk 環境名>
% eb list # デプロイ先の環境名に`*`がついていることを確認
% eb status # デプロイ先の環境のステータスなどの情報が取得されていることを確認
% eb deploy # デプロイ実行
4. 確認
SSH接続してデプロイしたアプリケーションに入って確認します。(SSH接続じゃなくても良いです。)
% eb ssh
# 以下、SSH接続
$ cd /var/app/current/config # /var/app/current がアプリケーションのルートディレクトリです。
$ ls #=> `sample_api_client.crt`と`sample_api_client.key`が存在していることを確認
sample_api_client.crtとsample_api_client.keyが存在していることを確認できればOKです。
まとめ
SSL証明書は、セキュリティ的にも.gitignoreに含めるものですので、このようにしてデプロイ先環境で証明書を使用するのが良いと思います。他にも方法はありそうですが、これが一番シンプルな気がしています。
以上