問題
AWS公式ブログに記載されている以下の実装例では、 amplify.yml
にて $secrets
で保存したシークレットが取得できる、とされています。
version: 1
frontend:
phases:
preBuild:
commands:
- yum -y install jq
- jq --version
- npm ci
build:
commands:
- echo $secrets | jq -r 'to_entries|map("\(.key)=\(.value)")|.[]' >> .env
- npm run build
artifacts:
baseDirectory: .next
files:
- "**/*"
cache:
paths:
- node_modules/**/*
しかし、実際に echo $secrets
や env
で確認しても、中身は空です(secrets
変数自体は存在するようです)。
GitHubのissueでも同様の問題が提起されており、サービスロールの権限の問題と指摘されていますが、自分はすべての権限を付与しても解決しませんでした。
なお、試した際の aws-amplify
のバージョンは 6.11.0
です。
解決策
実装
以下のように直接 aws ssm
コマンドを叩くと、シークレット値を取得できます。
version: 1
backend:
# 省略
frontend:
phases:
build:
commands:
- SOME_SECRET_1=$(aws ssm get-parameter --name "/amplify/shared/${AWS_APP_ID}/SOME_SECRET_1" --with-decryption --query "Parameter.Value" --output text 2>/dev/null || aws ssm get-parameter --name "/amplify/${AWS_APP_ID}/${AWS_BRANCH}/SOME_SECRET_1" --with-decryption --query "Parameter.Value" --output text)
- echo "SOME_SECRET_1=$SOME_SECRET_1" >> .env.production
- SOME_SECRET_2=$(aws ssm get-parameter --name "/amplify/shared/${AWS_APP_ID}/SOME_SECRET_2" --with-decryption --query "Parameter.Value" --output text 2>/dev/null || aws ssm get-parameter --name "/amplify/${AWS_APP_ID}/${AWS_BRANCH}/SOME_SECRET_2" --with-decryption --query "Parameter.Value" --output text)
- echo "SOME_SECRET_2=$SOME_SECRET_2" >> .env.production
- npm run build
# 以下省略
解説
Amplifyドキュメントにあるように、全ブランチ共通のシークレットは /amplify/shared/<app-id>/<secret-key>
に保存され、ブランチ固有のシークレットは /amplify/<app-id>/<branchname>/<secret-key>
に保存されます。
上記の実装では、最初に全ブランチ共通のシークレットから取得し、なければブランチ固有のシークレットから取得するようにしています。
ここでは build
フェーズで取得しましたが、 prebuild
で取得したほうがいいかもしれません。
おわりに
AWS公式ブログ通りに実装しても取得できないのは不思議です。
自分が何か勘違いしているだけかもしれないので、他に解決策があればぜひコメントで情報を共有してください。