🐙
TerraformによるGitHub organization用GitHub actionsに必要となる権限について
こんにちは、Luup SREチームのにわです。
短めにGitHub Appsの権限とGitHub Actionにおける設定方法について記載します。
経緯
LuupではInfrastructure as Code (IaC)に取り組んでいます。その中で、GitHubのOraganizationもPRベースで管理したいという事になり、Terraformとtfactionで実装することにしました。
本題
その中で、tfactionで普段使っているGitHub Appとわけて、GitHubのOraganization用にアプリを作成して、GitHub App tokenを取得するようにしました。
目的
- GitHub Organizaitonにおいて、以下のリソースをTerraform管理できるようにすること
- target resource
- github_membership: allows you to add/remove users from your organization
- github_repository_collaborator: allows you to add/remove collaborators from repositories in your organization or personal account. This resource can set admin permission.
- github_team: allows you to add/remove teams from your organization
- github_team_members: allows you to manage members of teams in your organization
- target resource
- 過大な権限をGitHub Appsに与えないこと
概要
◇実際に設定してみてつまづいたこと
- 既定で設定されている
GITHUB_TOKEN
が使われてしまっていたこと-
GITHUB_TOKEN
が使われてしまったことにより、取得したいAPIの権限が正しく利用できていなかったこと-
tfmigrate import
を利用した際のエラー内容:
Organization membershipの内容が読めない
※ログの組織名とユーザー名は架空のものですlog
Run bash /home/runner/work/_actions/suzuki-shunsuke/tfaction/v0.5.18/tfmigrate-plan/main.sh ===> Delete old plan file to prevent the accident ServiceException: 401 Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object. Permission 'storage.objects.get' denied on resource (or it may not exist). time="2023-02-02T07:16:07Z" level=info msg="download and unarchive the package" aqua_version=1.19.2 env=linux/amd64 exe_path=/home/runner/.local/share/aquaproj-aqua/pkgs/github_release/github.com/minamijoyo/tfmigrate/v0.3.9/tfmigrate_0.3.9_linux_amd64.tar.gz/tfmigrate package=minamijoyo/tfmigrate package_name=minamijoyo/tfmigrate package_version=v0.3.9 program=aqua registry=standard 2023/02/02 07:16:08 [INFO] [runner] unapplied migration files: [20220124_SRE-31f81_import_organization_settings.hcl] 2023/02/02 07:16:08 [INFO] [runner] load migration file: tfmigrate/20220124_SRE-31f81_import_organization_settings.hcl 2023/02/02 07:16:08 [INFO] [migrator] start state migrator plan 2023/02/02 07:16:08 [INFO] [migrator@../main] terraform version: 1.2.6 2023/02/02 07:16:08 [INFO] [migrator@../main] initialize work dir 2023/02/02 07:16:10 [INFO] [migrator@../main] get the current remote state 2023/02/02 07:16:12 [INFO] [migrator@../main] override backend to local 2023/02/02 07:16:12 [INFO] [executor@../main] create an override file 2023/02/02 07:16:12 [INFO] [migrator@../main] creating local workspace folder in: ../main/terraform.tfstate.d/default 2023/02/02 07:16:12 [INFO] [executor@../main] switch backend to local 2023/02/02 07:16:12 [INFO] [migrator@../main] compute a new state 2023/02/02 07:16:13 [INFO] [executor@../main] remove the override file 2023/02/02 07:16:13 [INFO] [executor@../main] remove the workspace state folder 2023/02/02 07:16:13 [INFO] [executor@../main] switch back to remote failed to run command (exited 1): terraform import -state=/tmp/tmp355741443 -state-out=/tmp/tfstate2968352349 -input=false -no-color -backup=/dev/null github_membership.admin["test_user001"] test_org001:test_user001 stdout: github_membership.admin["test_user001"]: Importing from ID "test_org001:test_user001"... github_membership.admin["test_user001"]: Import prepared! Prepared github_membership for import github_membership.admin["test_user001"]: Refreshing state... [id=test_org001:test_user001] stderr: Error: GET https://api.github.com/orgs/test_org001/memberships/test_user001: 403 Resource not accessible by integration []
-
-
◇上記問題を解決した上で、設定した内容は以下のとおりです。
- 権限
- Organization:
Custom repository roles: Read and write
Members: Read and write - Repository:
Actions: Read and write
Administration: Read and write
Secrets: Read-only
Metadata: Read-only
issues: Read-only for labbels and comment
Pull requests: Read and write
Contents: Read and write
- Organization:
- GitHub appsのTokenの取得方法
-
GITHUB_TOKEN
の設定方法が変わったため、それも合わせて使いました
- name: Generate token for GitHub manage id: github_token uses: tibdex/github-app-token@v1 with: app_id: ${{ secrets.GIHUB_ORG_APP_ID }} private_key: ${{ secrets.GIHUB_ORG_APP_PRIVATE_KEY }} - name: Set token to variable for GitHub manage run: echo GITHUB_APP_TOKEN="${GITHUB_APP_TOKEN}" >> "${GITHUB_ENV}" env: GITHUB_APP_TOKEN: ${{ steps.github_token.outputs.token }} - uses: suzuki-shunsuke/tfaction/terraform-plan@v0.5.25 with: github_app_token: ${{ env.GITHUB_APP_TOKEN }} github_token: ${{ env.GITHUB_APP_TOKEN }}
-
考慮事項
GitHub Providerを使う上で、Organizationの管理者がTerraformによってすべて削除されてしまう場合を想定して、GitHubサポートに質問しました。
- Organizationの管理者について、手動での操作やTerraformなどのAPI経由のツールを含めて、Organizationの管理者をすべて削除してしまった場合に管理者をOrganizationに戻すことは可能か。
➡️ 最後の管理者が組織を離れようとした場合、組織自体を削除しなければならない旨のメッセージが表示されます。また、組織の最後の管理者が自分のアカウントを削除しようとした場合、所有権を移譲するか、まず組織を削除する必要がある旨のメッセージが表示されます。
最後に
GitHub Actionsで使用する際に既定のGITHUB_TOKEN
の権限では足りないことがあり、Tokenの取得・設定方法は良い知見となりました。
ぜひご参考になれば幸いです。
Discussion