㊙️

AWS AmplifyでSecrets Managerから環境変数を取得してデプロイする方法

に公開

環境変数の管理にAWSのSecrets Managerを採用しているのですが、AWS Amplifyでアプリを作っている時に扱いに困りました。
と言うのも、AmplifyはAmplifyで環境変数を設定でき、直接Secrets Managerは読み込んでくれないからです。

https://docs.amplify.aws/react/deploy-and-host/fullstack-branching/secrets-and-vars/

だからと言ってSecrets ManagerとAmplifyの2重で管理してしまうと管理コストが重くなってしまうので、避けたいところでした。
そこで、Amplifyのビルド時にawsコマンドを使ってSecrets Managerからpullしてきて .env にすることで、環境変数の管理をSecrets Managerに一本化できたので、方法を共有します。

1. IAMロールの権限付与

まず、AmplifyがSecrets Managerにアクセスできるよう、適切な権限を付与します。

  1. Amplifyコンソールでアプリケーションの設定 > IAMロール > サービスロール の下にあるリンクをクリック
  2. 許可ポリシーの許可を追加 > インラインポリシー > ポリシーエディタのJSON で以下の内容を追加
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ReadSecrets",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "*"
        }
    ]
}

ポリシー名は SecretsManagerRead などわかりやすい名前で保存します。
また今回はResourceを便宜上 * としましたが、本番環境ではARNを指定することをお勧めします。

2. amplify.yamlの設定

今回はAWS公式のNext.jsテンプレートをベースに実装しました。

https://github.com/aws-samples/amplify-next-template

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デフォルトの暗号化キーを使用している場合はできません。ご注意ください。

https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/auth-and-access_examples_cross.html

これで設定は完了です!Secrets Managerで一元管理した環境変数をAmplifyのビルド時に取得できるようになりました😊

GitHubで編集を提案

Discussion