AWS AmplifyでSecrets Managerから環境変数を取得してデプロイする方法
環境変数の管理にAWSのSecrets Managerを採用しているのですが、AWS Amplifyでアプリを作っている時に扱いに困りました。
と言うのも、AmplifyはAmplifyで環境変数を設定でき、直接Secrets Managerは読み込んでくれないからです。
だからと言ってSecrets ManagerとAmplifyの2重で管理してしまうと管理コストが重くなってしまうので、避けたいところでした。
そこで、Amplifyのビルド時にawsコマンドを使ってSecrets Managerからpullしてきて .env
にすることで、環境変数の管理をSecrets Managerに一本化できたので、方法を共有します。
1. IAMロールの権限付与
まず、AmplifyがSecrets Managerにアクセスできるよう、適切な権限を付与します。
- Amplifyコンソールで
アプリケーションの設定 > IAMロール > サービスロール
の下にあるリンクをクリック -
許可ポリシーの許可を追加 > インラインポリシー > ポリシーエディタのJSON
で以下の内容を追加
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadSecrets",
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "*"
}
]
}
ポリシー名は SecretsManagerRead
などわかりやすい名前で保存します。
また今回はResourceを便宜上 *
としましたが、本番環境ではARNを指定することをお勧めします。
amplify.yaml
の設定
2. 今回はAWS公式のNext.jsテンプレートをベースに実装しました。
Amplifyではamplify.yaml
ファイルでビルド環境をカスタマイズできます。以下のように設定しました:
version: 1
frontend:
phases:
preBuild:
commands:
- sudo yum -y install jq
- |
aws secretsmanager get-secret-value \
--secret-id test \
--region ap-northeast-1 \
--query SecretString \
--output text | \
jq -r 'to_entries|map("\(.key)=\(.value)")|.[]' >> .env
build:
commands:
- npm ci --cache .npm --prefer-offline
- npm run build
artifacts:
baseDirectory: .next
files:
- '**/*'
cache:
paths:
- .next/cache/**/*
- .npm/**/*
- node_modules/**/*
ポイントは preBuild
フェーズです。ここでaws cliを使ってSecrets Managerから値を取得し、 .env
ファイルに書き出しています。
この際Secrets Managerから取得した値は .env
形式ではないため、 jq
コマンドで適切に整形しています。
なお、この方法では同一AWSアカウント内のSecrets Managerにしかアクセスできません。クロスアカウントでの読み取りはAWS KMSを使用している場合のみ可能で、AWSデフォルトの暗号化キーを使用している場合はできません。ご注意ください。
これで設定は完了です!Secrets Managerで一元管理した環境変数をAmplifyのビルド時に取得できるようになりました😊
Discussion