🔐

GitHub ActionsでAWS Secrets ManagerのJSONパース時のprefixを削除

2024/01/09に公開

GitHub Actionsでアプリケーションのビルドをする際に、AWS Secrets Managerで管理している秘匿情報などを環境変数に設定して利用したいとき、aws-actions/aws-secretsmanager-get-secrets を使うと非常に便利です。ちょっとした設定だけでGitHub Actions上でAWS Secrets Managerの情報を扱えるようになります。

AWS Secrets Managerではプレーンテキスト以外にもJSON形式(Key-value)もサポートされていて、複数の秘匿情報を扱うのが楽になります。aws-actions/aws-secretsmanager-get-secrets ではJSONを自動でパースするオプションがあります。

- name: Step name
  uses: aws-actions/aws-secretsmanager-get-secrets@v1
  with:
    secret-ids: |
      ENV_FOO_BAR, foo-bar
    parse-json-secrets: true

とても便利です。しかしこれは、展開する環境変数名にprefixが自動で付きます。例えば上記のYAMLの場合、以下のJSONをSecrets Managerに登録していた場合…

// Secrets Managerに登録したJSON
{
  "key1": "value1",
  "key2": "value2"
}

以下のように ENV_FOO_BAR_ のprefixがついた状態で環境変数が展開されます。

ENV_FOO_BAR_KEY1=value1
ENV_FOO_BAR_KEY2=value2

このままだと環境変数を使うアプリケーション側で対応が必要になり、GitHub Actions依存の命名になってちょっと嫌な感じです。このprefixを付けないオプションがIssueで提案されてますが、今のところ反応はありません。

そこでGitHub Actions上でprefixを取り除いて環境変数にセットするようにしてみます。対応はシンプルでBashスクリプトで削除し、GitHub Actions全体で利用できるように書き出すだけです。

- name: Get secrets from AWS Secrets Manager
  id: get-aws-secret
  uses: aws-actions/aws-secretsmanager-get-secrets@v1
  with:
    secret-ids: |
      ENV_FOO_BAR, foo-bar
    parse-json-secrets: true

- name: Remove prefix from secrets
  run: |
    for variable in "${!ENV_FOO_BAR_@}"; do 
      echo "${variable#ENV_FOO_BAR_}=${!variable}" >> $GITHUB_ENV
    done

これで KEY1KEY2 という環境変数で使えるようになります。$GITHUB_ENV というのはGitHub Actionsの各ステップで再利用できる環境変数ファイルです。これでアプリケーション側は何も対応をしなくても済むようになりました。

ムーザルちゃんねる

Discussion