AWS OIDC プロバイダーを使って GitHub Actions で AWS CLI を実行する

Posts

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 プロバイダーを作成する

  1. AWS IAM を開く
  2. 左メニューから[ID プロバイダ]を選択する
  3. [ID プロバイダを追加]をクリックする
  4. 次の内容を入力する
    • プロバイダのタイプ - OpenID Connect
    • プロバイダの URL - https://token.actions.githubusercontent.com
    • 対象者 - sts.amazonaws.com
  5. プロバイダの URL の[サムプリントを取得]をクリックする

STEP3:IAM ロールを作成する

GitHub Actions で S3 コマンドを実行するための IAM ロールを作成する。

  1. 左メニューから[IAM ロール]を選択する

  2. 「信頼されたエンティティタイプ」に「カスタム信頼ポリシー」を選択する

  3. ロールの信頼関係のポリシーに、次の内容を入力する。

    {
      "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 を確認できる。
      スクリーンショット:AWS アカウント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:*"
      }
    }
    
  4. 「許可ポリシー」に、実行する AWS コマンドに合わせた許可ポリシーを設定する。
    今回は、aws s3 ls を実行するために必要な許可ポリシーを付与する。

  5. 「ロール名」を入力する。
    このロール名は、GitHub Workflow で使用するので、メモに控えておく。

STEP4:GitHub Secrets を設定する

GitHub リポジトリの設定で、次の値を Secrets に設定する。

  • AWS_ACCOUNT_ID - AWS のアカウント ID
  • AWS_IAM_ROLE_NAME - STEP3 で作成した IAM ロール名

STEP5:テスト用のリポジトリに GitHub Workflow を作成する

  1. 次の中身で、GitHub Action ワークフローを作成する。

    .github/workflows/test.yml
    name: 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
    
  2. GitHub Action ワークフローファイルをコミットする

STEP6:動作を確認する

  1. STEP5 で作ったコミットをプッシュする
  2. GitHub Actions を開き、実行結果を確認する。
    aws s3 ls の実行結果として、S3 のバケット一覧が表示されていれば良い。
    スクリーンショット:GitHub Actions の実行結果。S3 のバケット一覧が表示されている

補足:Serverless Framework を使うとき

Serverless Framework を使う場合にも、default プロファイルとして設定されるので、いい感じに AWS の認証情報が設定される。
なので GitHub Actions では AWS のコマンドの代わりに Serverless Framework のコマンド sls deploy を実行すれば良い。

      - run: |
          npm ci
          npx sls deploy