🚨

GitHubActionsのAWS認証をOIDC経由にしたら、TerraformのPlan出力がプルリクのコメントに追記されなくなった

2021/11/07に公開

少し前に話題になっていた、AWSアクセスキーを使用せずにOIDCプロバイダ+IAMロールでGitHub Actionsに権限を付与する方法について、GitHubから正式な発表がありました!!

https://github.blog/changelog/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect/

TerraformのCI/CDにGitHub Actionsを利用していたので早速試してみたところ、プルリクレビュー目的にて利用しているterraform plan結果のコメント通知が表示されない事象に遭遇したため、対応したメモになります。

前提

terraform plan結果のコメント通知は以下のActionを利用しています。

https://github.com/marketplace/actions/terraform-pr-commenter

実際に動かしていたWorkflowファイルが以下です。

プルリクエストを作成すると、terraform plan結果がコメントとして追記されます。

OIDCへの変更

以下の公式サイトの例を参考に修正します。
https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#requesting-the-access-token

修正後のWorkflowファイルが以下です。

変更箇所

  • permissionsの追加
  • aws-actions/configure-aws-credentialsアクションのパラメータをアクセスキーからロールに変更

ここでは割愛していますが、事前に使用するロールを作成しています。
作成方法はconfigure-aws-credentialsの情報を参照してください。
https://github.com/aws-actions/configure-aws-credentials#sample-iam-role-cloudformation-template

事象

変更後にプルリクを作成すると、terraform plan結果がコメントに追記されません。
GitHub Actionsのコメント通知のステップの出力を確認すると以下のメッセージが出ていました。

jq: error (at <stdin>:4): Cannot index string with string "body"

Actionのコードを確認してみると、プルリクエストのコメントIDを取得する箇所が上手くいってないように見えます。

  echo -e "\033[34;1mINFO:\033[0m Looking for an existing init PR comment."
  PR_COMMENT_ID=$(curl -sS -H "$AUTH_HEADER" -H "$ACCEPT_HEADER" -L "$PR_COMMENTS_URL" | jq '.[] | select(.body|test ("### Terraform `init` Failed")) | .id')
  if [ "$PR_COMMENT_ID" ]; then
    echo -e "\033[34;1mINFO:\033[0m Found existing init PR comment: $PR_COMMENT_ID. Deleting."
    PR_COMMENT_URL="$PR_COMMENT_URI/$PR_COMMENT_ID"
    curl -sS -X DELETE -H "$AUTH_HEADER" -H "$ACCEPT_HEADER" -L "$PR_COMMENT_URL" > /dev/null
  else
    echo -e "\033[34;1mINFO:\033[0m No existing init PR comment found."

https://github.com/robburger/terraform-pr-commenter/blob/72c6e45eced6641488a6cf3ff104b7b9bda9c66c/entrypoint.sh#L127-L134

調査

Action内のcurlの実行結果が正しくない可能性があるので、同じ処理を実行するステップを追加して出力結果を確認してみます。

以下のメッセージが出力されており、リソースへのアクセスで何らかの問題が起きていることがわかりました。

{
  "message": "Resource not accessible by integration",
  "documentation_url": "https://docs.github.com/rest/reference/issues#list-issue-comments"
}

メッセージで調べてみると以下の記事を見つけました。
https://dev.classmethod.jp/articles/mapping-secrets-github-token/

記事ではsecrets.GITHUB_TOKENの権限に触れているのですが、今回のワークフローの変更にて追加したpermissionsオプションはまさにGITHUB_TOKENに付与されている権限を変更する為のオプションであり、原因の可能性が高そうです。

permissionsの状態を調査

公式サイトを確認すると以下の記述があり、実行結果から処理中の権限が確認できることがわかります。

GITHUB_TOKEN が特定のジョブに対して保持していた権限は、ワークフロー実行ログの [Set up job] セクションで確認できます。

https://docs.github.com/ja/actions/security-guides/automatic-token-authentication#modifying-the-permissions-for-the-github_token

変更前の実行ログ

変更後の実行ログ

明らかに権限が減っていることがわかります。

変更前はpermissionsを指定しない事で、デフォルトの権限が設定されていたのが、追加する事で、指定した権限しか与えられない状態になっていました。

https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token

対応

プルリクに対するコメントの追記をしたいので、以下の権限を追加する事で無事にコメントが追記されるようになりました。

permissions:
  id-token: write
  contents: write 
  issues: write ← 追加
  pull-requests: write ← 追加

まとめ

GitHubActionsは活用していたのですが、permissionsについては利用したことがなく、思わぬ落とし穴にはまってしまいました・・

OIDC経由での権限付与については、セキュリティの観点からも推し進める必要がある一方、GitHubActionsからGitHubの操作を行うシーンは他にも発生すると思われるので、今後はGITHUB_TOKENの権限についても意識しつつ、活用していく必要がありそうです。

Discussion