GitHub ActionsでAWSにAssumeRoleでデプロイしてSlack通知しようとしたらError: Resource not accessible by integrationが発生した

2021.11.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

2021/11/26追記 本記事の内容をリポジトリのREADMEに取り込んでもらえました。 https://github.com/8398a7/action-slack/pull/177

吉川@広島です。

GitHub Actions OIDCが熱いですね。日本語情報も続々出てきています。

さて、GitHub Actions上で

aws-actions/configure-aws-credentials: Configure AWS credential environment variables for use in other GitHub Actions.

でAWSへの操作権限を得てデプロイし、その結果を

8398a7/action-slack: Provides the function of slack notification to GitHub Actions.

でSlack通知する仕組みを作ったところ、Slack通知実行時に

Error: Resource not accessible by integration

というエラーが発生し悩まされたので、解決法を共有します。

ちなみに以下、例に出すWorkflowファイルでは説明の簡略化のために use: aws-actions/configure-aws-credentials の記述を抜き、 uses: 8398a7/action-slack@v3 の処理のみ記述しています。ご留意ください。

原因はpermissionsの指定の仕方にありました。

[OK] permissions指定なし

まず、permissionsを指定せずにSlack通知してみます。

name: Slack test
on: push

jobs:
  slack-test:
    runs-on: ubuntu-latest
    steps:
      - uses: 8398a7/action-slack@v3
        with:
          status: ${{ job.status }}
          fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
        if: always()

問題なく完了できました。

注目したいのが、GITHUB_TOKEN Permissionsです。明示的にPermissionsを指定しない場合、デフォルトでこれらの権限が付与されるという動きをするようです。

手元で検証した結果、8398a7/action-slack@v3の実行にはcontentsとactionsのread権限が必要のようでした。そして、デフォルトの権限で両方とも満たせているため動作するというわけです。

[NG] id-tokenとcontentsのpermissionsを指定

では上記にconfigure-aws-credentialsを加える想定をします。

Configuring OpenID Connect in Amazon Web Services - GitHub Docs

ドキュメントによると、id-tokenとcontentsのpermissionsを与える必要があると書いてありますね。で、そのようにすると以下のエラーになります。

name: Slack test
on: push

+permissions:
+ id-token: write
+ contents: read
jobs:
  slack-test:
    runs-on: ubuntu-latest
    steps:
      - uses: 8398a7/action-slack@v3
        with:
          status: ${{ job.status }}
          fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
        if: always()

Permissionsを明示的に指定した場合、 Metadata: read を除く指定外の権限はすべてオフになるようです。そのため、actionsの権限が足りずエラーになりました。

[OK] id-tokenとcontentsとactionsのpermissionsを指定

というわけで、明示的に actions: read を加えます。

name: Slack test
on: push

permissions:
  id-token: write
  contents: read
+ actions: read
jobs:
  slack-test:
    runs-on: ubuntu-latest
    steps:
      - uses: 8398a7/action-slack@v3
        with:
          status: ${{ job.status }}
          fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
        if: always()

これで意図通り動作しました。

まとめ

aws-actions/configure-aws-credentialsと8398a7/action-slack@v3の2つのアクションを組み合わせて使う際には

permissions:
  id-token: write
  contents: read
  actions: read

の権限を明示的にセットする必要があるというお話でした。

今まで雰囲気で扱っていたGitHub ActionsのPermissionsまわりが少しだけわかってきた気がします。

参考