Open9

GitHub Actions で secrets を AWS Secrets Manager や Google Cloud Secret Manager から取得する

Shunsuke SuzukiShunsuke Suzuki

tfaction では GitHub App の Private key などを取得する必要がある。
また Terraform の実行に必要な secret を取得する必要がある。これは working directory ごとに異なるはず。
ただ、同じ secret を複数箇所で管理するより、一箇所で管理して権限を付与するほうが良い。

Shunsuke SuzukiShunsuke Suzuki

tfaction によるよりセキュアな secret management

  1. Google Secret Manager support https://github.com/suzuki-shunsuke/tfaction/issues/1350
  2. 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

https://registry.terraform.io/providers/integrations/github/latest/docs#oauth--personal-access-token

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 が発生してしまう

Shunsuke SuzukiShunsuke Suzuki

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)}}
Shunsuke SuzukiShunsuke Suzuki
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
Shunsuke SuzukiShunsuke Suzuki
uses: get-secrets
with:
  secrets: ${{secrets}}
uses: test
with:
  secrets: ${{secrets}}
  github_token: ${{github.token}}