GitHub Actions で secrets を AWS Secrets Manager や Google Cloud Secret Manager から取得する
AWS
Google Cloud
tfaction では GitHub App の Private key などを取得する必要がある。
また Terraform の実行に必要な secret を取得する必要がある。これは working directory ごとに異なるはず。
ただ、同じ secret を複数箇所で管理するより、一箇所で管理して権限を付与するほうが良い。
現状 tfaction では AWS Secrets Manager を使った secret management をサポートしている
Google Cloud もサポートすると良い
tfaction によるよりセキュアな secret management
- Google Secret Manager support https://github.com/suzuki-shunsuke/tfaction/issues/1350
- GitHub を Terraform で管理する用の GitHub Access Token を、 PR にコメントしたりするのに使う token と分ける
その場合、 GitHub を Terraform で管理する用の GitHub Access Token は GitHub を管理する working directory だけに生成されるべきだし、場合によっては working directory ごとに permissions や repositories は異なるし、 GitHub App から生成されるべき
GitHub App の Private Key は AWS Secrets Manager などで管理されるべき
github_token:
- env_name: TF_VAR_github_token
source: aws_secrets_manager
secret_id: github_app
secret_key_of_id: app_id
secret_key_of_pemfile: app_pemfile
permissions:
contents: read
repositories:
- foo
Terraform Provider の Authentication としては GitHub App にも対応しているが、 installation id が必要で permissions や repositories がパラメータとしてないので、 GitHub App から token を発行して渡す方が楽かもしれない。
export-secrets や export-aws-secrets-manager のように環境変数に bind するのは、後続の任意の step で secret を参照できてしまうため、あまりセキュアとは言えない。
理想的には secret を output する action を提供し、 setup や test, terraform-plan など、 terraform を実行する action が terraform を実行する step でのみ env
を使って環境変数に bind するべき。
ただし複数回その action を実行するのは無駄に API call が発生してしまう
setup action で secret を output し、 test や plan に渡すのはありか?
- uses: suzuki-shunsuke/tfaction/export-aws-secrets-manager@main
id: aws-secrets
with:
appended_outputs: |
GITHUB_TOKEN: ${{github.token}}
- uses: suzuki-shunsuke/github-action-terraform-init@v1.0.0
env: ${{fromJSON(steps.aws-secrets.output.secrets)}}
github_provider_token:
source: aws_secrets_manager
secret_id: github_app
secret_key_of_id: app_id
secret_key_of_pemfile: app_pemfile
permissions:
contents: read
repositories:
- foo
uses: get-secrets
with:
secrets: ${{secrets}}
uses: test
with:
secrets: ${{secrets}}
github_token: ${{github.token}}