🐙

TerraformによるGitHub organization用GitHub actionsに必要となる権限について

2023/08/03に公開

こんにちは、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
  • 過大な権限を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
  • 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の取得・設定方法は良い知見となりました。
ぜひご参考になれば幸いです。

Luup Developers Blog

Discussion