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