AWS OIDCプロバイダーを使ってGitHub ActionsでAWS CLIを実行する
GitHub ActionsでAWS CLIを実行する場合、configure-aws-credentialsを使うと、安全にAWSの認証情報をセットアップできる。
このとき、AWSの認証情報であるアクセスキー IDとシークレットアクセスキーを設定する方法には、次の2つがある。
- GitHubの設定で、Secretsの環境変数に設定する
- AWS OIDCプロバイダーを使う
この記事では、後者のAWS OIDCプロバイダーを使う手順を説明する。
AWS OIDCプロバイダーを使うと、AWS OIDCプロバイダーがワークフローを実行するたびに、必要なシークレットアクセスキーが発行される。
そのため、GitHub Actions用の認証情報を管理する手間がなくなる。
AWS OIDCプロバイダーを使ってGitHub ActionsでAWS CLIを実行する
AWS OIDCプロバイダーを使ってGitHub ActionsでAWS CLIを実行する手順を説明する。
今回は、S3の一覧を取得するコマンドaws s3 ls
を実行し、バケット一覧を出力することをゴールとする。
STEP0:テスト用のリポジトリを作成する
GitHubにテスト用のリポジトリを作る。ひとまず中身は空にする。
デフォルトのブランチ名は何でも良いが、ここではmain
にする。
STEP1:OIDCプロバイダーを作成する
- AWS IAMを開く
- 左メニューから[IDプロバイダ]を選択する
- [IDプロバイダを追加]をクリックする
- 次の内容を入力する
- プロバイダのタイプ - OpenID Connect
- プロバイダの URL -
https://token.actions.githubusercontent.com
- 対象者 -
sts.amazonaws.com
- プロバイダのURLの[サムプリントを取得]をクリックする
STEP3:IAMロールを作成する
GitHub ActionsでS3コマンドを実行するためのIAMロールを作成する。
左メニューから[IAMロール]を選択する
「信頼されたエンティティタイプ」に「カスタム信頼ポリシー」を選択する
ロールの信頼関係のポリシーに、次の内容を入力する。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::AWS_ACCOUNT_ID:oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "token.actions.githubusercontent.com:sub": "repo:GITHUB_USERNAME/GITHUB_REPOSITORY_NAME:ref:refs/heads/main" } } } ] }
次の変数は、自分の環境に合わせて置き換える。
AWS_ACCOUNT_ID
- AWSのアカウントID
GitHub Secretsでも設定するので、メモに控えておく。
ヘッダーの自分のアカウント名横の[▼]をクリックすると、アカウントIDを確認できる。GITHUB_USERNAME
- GitHubのユーザー名GITHUB_REPOSITORY_NAME
- GitHubのテストリポジトリ名
token.actions.githubusercontent.com:sub
に設定した値で、どのリポジトリのどのブランチから呼び出すかを定義している。
Pull RequestでGitHub Actionsを実行したいなどブランチを指定したくない場合には、ワイルドカードで指定する。
この場合Condition
は、StringEquals
の代わりにStringLike
を使用する必要がある。"Condition": { "StringLike": { "token.actions.githubusercontent.com:sub": "repo:GITHUB_USERNAME/GITHUB_REPOSITORY_NAME:*" } }
「許可ポリシー」に、実行するAWSコマンドに合わせた許可ポリシーを設定する。
今回は、aws s3 ls
を実行するために必要な許可ポリシーを付与する。「ロール名」を入力する。
このロール名は、GitHub Workflowで使用するので、メモに控えておく。
STEP4:GitHub Secretsを設定する
GitHubリポジトリの設定で、次の値をSecretsに設定する。
AWS_ACCOUNT_ID
- AWSのアカウントIDAWS_IAM_ROLE_NAME
- STEP3で作成したIAMロール名
STEP5:テスト用のリポジトリにGitHub Workflowを作成する
次の中身で、GitHub Actionワークフローを作成する。
.github/workflows/test.ymlname: OIDC TEST on: push permissions: id-token: write contents: read jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: aws-actions/configure-aws-credentials@v1 with: role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ secrets.AWS_IAM_ROLE_NAME }} aws-region: ap-northeast-1 - run: | aws s3 ls
GitHub Actionワークフローファイルをコミットする
STEP6:動作を確認する
- STEP5で作ったコミットをプッシュする
- GitHub Actionsを開き、実行結果を確認する。
aws s3 ls
の実行結果として、S3のバケット一覧が表示されていれば良い。
補足:Serverless Frameworkを使うとき
Serverless Frameworkを使う場合にも、defaultプロファイルとして設定されるので、いい感じにAWSの認証情報が設定される。
なのでGitHub ActionsではAWSのコマンドの代わりにServerless Frameworkのコマンドsls deploy
を実行すれば良い。
- run: |
npm ci
npx sls deploy