GitHubActionsのAWS認証をOIDC経由にしたら、TerraformのPlan出力がプルリクのコメントに追記されなくなった
少し前に話題になっていた、AWSアクセスキーを使用せずにOIDCプロバイダ+IAMロールでGitHub Actionsに権限を付与する方法について、GitHubから正式な発表がありました!!
TerraformのCI/CDにGitHub Actionsを利用していたので早速試してみたところ、プルリクレビュー目的にて利用しているterraform plan
結果のコメント通知が表示されない事象に遭遇したため、対応したメモになります。
前提
terraform plan
結果のコメント通知は以下のActionを利用しています。
実際に動かしていたWorkflowファイルが以下です。
プルリクエストを作成すると、terraform plan
結果がコメントとして追記されます。
OIDCへの変更
以下の公式サイトの例を参考に修正します。
修正後のWorkflowファイルが以下です。
変更箇所
-
permissions
の追加 -
aws-actions/configure-aws-credentials
アクションのパラメータをアクセスキーからロールに変更
ここでは割愛していますが、事前に使用するロールを作成しています。
作成方法はconfigure-aws-credentials
の情報を参照してください。
事象
変更後にプルリクを作成すると、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."
調査
Action内のcurlの実行結果が正しくない可能性があるので、同じ処理を実行するステップを追加して出力結果を確認してみます。
以下のメッセージが出力されており、リソースへのアクセスで何らかの問題が起きていることがわかりました。
{
"message": "Resource not accessible by integration",
"documentation_url": "https://docs.github.com/rest/reference/issues#list-issue-comments"
}
メッセージで調べてみると以下の記事を見つけました。
記事ではsecrets.GITHUB_TOKEN
の権限に触れているのですが、今回のワークフローの変更にて追加したpermissions
オプションはまさにGITHUB_TOKEN
に付与されている権限を変更する為のオプションであり、原因の可能性が高そうです。
permissionsの状態を調査
公式サイトを確認すると以下の記述があり、実行結果から処理中の権限が確認できることがわかります。
GITHUB_TOKEN が特定のジョブに対して保持していた権限は、ワークフロー実行ログの [Set up job] セクションで確認できます。
変更前の実行ログ
変更後の実行ログ
明らかに権限が減っていることがわかります。
変更前はpermissions
を指定しない事で、デフォルトの権限が設定されていたのが、追加する事で、指定した権限しか与えられない状態になっていました。
対応
プルリクに対するコメントの追記をしたいので、以下の権限を追加する事で無事にコメントが追記されるようになりました。
permissions:
id-token: write
contents: write
issues: write ← 追加
pull-requests: write ← 追加
まとめ
GitHubActionsは活用していたのですが、permissions
については利用したことがなく、思わぬ落とし穴にはまってしまいました・・
OIDC経由での権限付与については、セキュリティの観点からも推し進める必要がある一方、GitHubActionsからGitHubの操作を行うシーンは他にも発生すると思われるので、今後はGITHUB_TOKEN
の権限についても意識しつつ、活用していく必要がありそうです。
Discussion