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