GitHub ActionsにAWS リソースへのアクセス権を渡すには?

課題

GitHub ActionsでAWSのリソースを操作したい場合、当然に権限を持つ必要がある。

どうすればいいか。

解決

その1 アクセスキーを払い出す

まず思いつくのは専用のIAMユーザーとAWSアクセスキーを作成し、GitHub Actionsに使わせること。

もちろんアクセスキーをハードコーディングするのは避けるべきで、利用する際はGithubのsecretsとして先に保存し、そこから読みだしたアクセスキーを設定する。

    deploy:
        runs-on: ubuntu-22.04
        strategy:
        matrix:
            python-version: ["3.9"]
        steps:
        - uses: actions/checkout@v3
        - name: aws-credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
            # この部分。
            aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            aws-region: ${{ env.AWS_REGION }}

しかしこれだとアクセスキーの払い出しが必要となる。またアクセスキーの管理もずっとしなければならない。もちろん可能だが、避けられるなら避けたい。

その2  OpenID Connect + Role

素晴らしくもOpenID Connect方式でRoleを割り振ることができる。

AWS側でID プロバイダの設定を済ませた後、

    # Terraform用コード。尚変数を外から読み込んでいる関係で、これだけだと動かない。
    locals {
    deploy_name = "${var.environment.name}-github-actions-deploy"
    }

    # https://zenn.dev/yukin01/articles/github-actions-oidc-provider-terraform 参照
    data "http" "github_actions_openid_configuration" {
    url = "https://token.actions.githubusercontent.com/.well-known/openid-configuration"
    }

    data "tls_certificate" "github_actions" {
    url = jsondecode(data.http.github_actions_openid_configuration.body).jwks_uri
    }

    resource "aws_iam_openid_connect_provider" "github_actions_deploy" {
    url = "https://token.actions.githubusercontent.com"

    client_id_list = ["sts.amazonaws.com"]
    # https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html
    thumbprint_list = data.tls_certificate.github_actions.certificates[*].sha1_fingerprint
    }

    resource "aws_iam_role" "github_actions_deploy" {
    name                 = local.deploy_name
    path                 = "/"
    description          = "For deploy"
    assume_role_policy   = templatefile("${path.module}/templates/iam_role_github_actions_deploy_assume_role_policy.json", { repository_key = var.common.repository_key, aws_account_id = var.common.aws_account_id })
    managed_policy_arns  = concat([var.iam_policy_github_actions_deploy.arn], var.github_actions.additional_policys)
    max_session_duration = "3600"
    }

下記のようなGitHub Actions用設定で動かせる。

    env:
    AWS_REGION: "ap-northeast-1"
    AWS_ROLE_ARN: "${{ secrets.AWS_ROLE_ARN }}"

    # AWS OpenID Connect用
    permissions:
    id-token: write
    contents: read

    jobs:
    test-and-deploy:
        runs-on: ubuntu-22.04
        strategy:
        matrix:
            python-version: ["3.9"]
        steps:
        - uses: actions/checkout@v3
        # ~途中省略~
        - uses: aws-actions/configure-aws-credentials@v1
            with:
            role-to-assume: ${{ env.AWS_ROLE_ARN }}
            aws-region:  ${{ env.AWS_REGION }}
        - run: aws sts get-caller-identity

参考