こんにちは、森田です。
本記事では、GitHub Actions で OIDC 連携で Assume Role する方法を紹介していきます
はじめに
直近で thumbprint が変更となっているため、以前と同じ値で設定するとエラーが生じるようです。
An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint
thumbprint 変更は、証明書変更となるタイミングで生じますので、手動更新または、自動更新の仕組みを導入する必要があります。
本記事では、2023年7月時点での以下の thumbprint を設定していきます。
1c58a3a8518e8759bf075b76b750d4f2df264fcd
f879abce0008e4eb126e0097e46620f5aaae26ad
ロールの作成
以下のコードを利用して CloudFormation でロールの作成を行います。
role.yml
AWSTemplateFormatVersion: "2010-09-09"
Description: "IAM Role for OIDC GitHub"
Parameters:
RepoName:
Type: String
Resources:
Role:
Type: AWS::IAM::Role
Properties:
RoleName: OIDCGithubRole
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Action: sts:AssumeRoleWithWebIdentity
Principal:
Federated: !Ref GithubOidc
Condition:
StringLike:
token.actions.githubusercontent.com:sub: !Sub repo:${RepoName}:*
GithubOidc:
Type: AWS::IAM::OIDCProvider
Properties:
Url: https://token.actions.githubusercontent.com
ClientIdList: [sigstore]
ThumbprintList: [1c58a3a8518e8759bf075b76b750d4f2df264fcd, f879abce0008e4eb126e0097e46620f5aaae26ad]
Outputs:
Role:
Value: !GetAtt Role.Arn
CloudFormation では、以下のようにリポジトリの入力が求められます。
CloudFormationスタック作成後は、出力に表示されているロールのARNをメモしておきます。
GitHub 側の設定
環境変数の設定
先ほど作成したロールのARNを環境変数に設定します。
ワークフローの作成
今回は、動作確認のため、以下のようなワークフローを作成します。
sample.yml
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
env:
AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }}
permissions:
id-token: write
contents: read
steps:
- name: Checkout
uses: actions/checkout@master
- name: Configure AWS
run: |
export AWS_ROLE_ARN=$AWS_ROLE_ARN
export AWS_WEB_IDENTITY_TOKEN_FILE=/tmp/awscreds
export AWS_DEFAULT_REGION=ap-northeast-1
echo AWS_WEB_IDENTITY_TOKEN_FILE=$AWS_WEB_IDENTITY_TOKEN_FILE >> $GITHUB_ENV
echo AWS_ROLE_ARN=$AWS_ROLE_ARN >> $GITHUB_ENV
echo AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION >> $GITHUB_ENV
curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=sigstore" | jq -r '.value' > $AWS_WEB_IDENTITY_TOKEN_FILE
- run: aws sts get-caller-identity
上記のコードでは、GetCallerIdentityを実行して、アカウントIDなどを取得しています。
動作確認
作成したワークフローは、mainブランチへのpushをトリガーとしています。
実際にpushしてみると以下のようにログにて各種情報を取得できていれば、問題なく OIDC 連携で Assume Role ができています。
最後に
今回は、新しい thumbprint を用いて GitHub Actions 上で OIDC 連携 Assume Role をやってみましたがお手軽に実行できました。
手動で thumbprint を設定しましたが、自動で取得してくれるものあるので、そのようなものを導入するとより楽になりますね!