ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

GitHub Actionsと連携するためのIAMを設定する

こんにちわ、AWSエンジニアチームの山口です。

ビルドパイプラインにGitHub Actionsを利用することが増えていますが、社内共有用のメモを整理したのでブログ化します。

1. IAM IDプロバイダを作成

AWSマネージメントコンソールから、IAM へ移動します。「ID プロバイダ」を選択し、「プロバイダを追加」 をクリックします。

下記の通りに入力し、「サムプリントを取得」をクリックします。

  • プロバイダのタイプ: OpenID Connect
  • プロバイダの URL : https://token.actions.githubusercontent.com
  • 対象者: sts.amazonaws.com

「サムプリントを確認」が表示されたことを確認し、「プロバイダを追加」をクリックします。

IDプロバイダが追加されたことを確認します。

2. GitHub Actionsと連携するIAMロールを作成する

IAM から 「ロール」を選択し、「ロールを作成」をクリックします。

信頼されたエンティティタイプは、「カスタム信頼ポリシー」を選択します。 カスタム信頼ポリシーに下記のJSONをご自身の環境に合わせて修正し、入力します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<AWSアカウントID>:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
                    "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザー名>/<GitHubリポジトリ名>:ref:refs/heads/<ブランチ名>"
                }
            }
        }
    ]
}

今回は、developブランチに push もしくは merge された時に GitHub Actions で Orca Security Shift Left をビルドパイプラインに組み込むため、下記のような JSON を入力しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
                    "token.actions.githubusercontent.com:sub": "repo:masanoriyamaguchi/orca-shiftleft-sample:ref:refs/heads/develop"
                }
            }
        }
    ]
}

入力後、画面下部にある「次へ」をクリックします。次の画面で「ポリシーを作成」をクリックします。

ポリシーエディタにてECRリポジトリにアクセスするためのIAMポリシーを設定します。下記のような JSON を入力します。実際に利用する際は、運用するビルドパイプラインにおいてGithub ActionとAWSの連携に必要な権限を設定してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListImagesInRepository",
            "Effect": "Allow",
            "Action": [
                "ecr:ListImages"
            ],
            "Resource": [
                "arn:aws:ecr:<AWSリージョンID>:<AWSアカウントID>:repository/<ECRリポジトリ名>"
            ]
        },
        {
            "Sid": "GetAuthorizationToken",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ManageRepositoryContents",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:DescribeImages",
                "ecr:BatchGetImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:PutImage"
            ],
            "Resource": [
                "arn:aws:ecr:<AWSリージョンID>:<AWSアカウントID>:repository/<ECRリポジトリ名>"
            ]
        }
    ]
}

入力後、画面下部にある「次へ」をクリックします。次の画面で「ポリシー名」を入力し、「ポリシーの作成」クリックします。

以上でIAMの設定は完了です。

3. [おまけ]GitHub ActionsでAWSへの認証(OIDC)を行う

AWS IAMの設定は完了しましたが、実際に GitHub Actions で利用するには、ワークフローを作成する必要があります。 参考までにdockerイメージをビルドして、ECRリポジトリにpushするためのワークフローを記載します。

name: ecr push image

on:
  push:
    branches:
      - develop

jobs:
  push:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v3

      # AWS認証(OIDC)をするためのステップ
      - uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: "ap-northeast-1"
          # 作成したIAMロールのARNを記載
          role-to-assume: "arn:aws:iam::123456789012:role/yamaguchi-test-guthub-role"

      - uses: aws-actions/amazon-ecr-login@v1
        id: login-ecr # outputs で参照するために id を設定

      - name: build and push docker image to ecr
        env:
          REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          REPOSITORY: "yamaguchi-orca-shiftleft-ecr"
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build . --tag ${{ env.REGISTRY }}/${{ env.REPOSITORY }}:${{ env.IMAGE_TAG }}
          docker push ${{ env.REGISTRY }}/${{ env.REPOSITORY }}:${{ env.IMAGE_TAG }}