😀

GitHub ActionからAWSへのアクセス方法

2023/10/22に公開

githubからAWSを操作する際に、
一昔前まではクレデンシャルファイルをgithub上に保管し,運用するケースが多かったが。
old
今IDプロバイダーを使用した方がセキュリティ上優れてる観点から、主流になってるそうだ。
img
実際IDプロバイダーを利用するため、手順は下記三つが必要。
1.AWS上にIDプロバイダーを用意
2.AWS上にIAMロールを用意
3.Github上にworkflowにpermissionの設定を入れる

AWSコンソールから操作する場合とTerraform利用する場合の2つのやり方を紹介する。

AWSコンソールから

AWS上にIDプロバイダーの用意

コンソールからIAMに移動し、左メニューバーのアクセス管理からIDプロバイダを選択する
画面右にあるプロバイダを追加ボタンを選択して追加を行う
id

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

公式ドキュメント

設定終わったら、プロバイダを追加を選択するして、
github用のIDプロバイダー新規作られたことが確認できるはず。

AWS上にIAMロールを用意

コンソールからIAMに入り、左のメニューバーからアクセス管理ロールを選び、
右にあるロールを作成を選択。
iam

信頼されたエンティティタイプ ウェブアイデンティティ
アイデンティティプロバイダー 作成ずみのIDプロバイダーを指定
Audience sts.amazonaws.com
GitHub 組織 OrganizationName
GitHub リポジトリ RepoName
許可の追加 AdministratorAccess(必要に応じて)
ロール名 任意

公式ドキュメント

workflowsの修正

yaml
name: "workflow name"
on: [push]

permissions:
  id-token: write   # This is required for requesting the JWT
  contents: read    # This is required for actions/checkout
jobs:
  sample:
    name: "name"
    runs-on: ubuntu-latest
    steps:
      - run: |
        echo "hello world"

Terraformから

IDプロバイダーの用意

data "tls_certificate" "github" {
  url = "https://token.actions.githubusercontent.com/.well-known/openid-configuration"
}

resource "aws_iam_openid_connect_provider" "github_actions_oidc" {
  url = "https://token.actions.githubusercontent.com"
  client_id_list = [
    "sts.amazonaws.com",
  ]
  thumbprint_list = [
    data.tls_certificate.github.certificates[0].sha1_fingerprint,
  ]
}

IAMロール用意

yaml
data "aws_iam_policy_document" "repo_name_actions_trusted_entities" {
  statement {
    effect = "Allow"
    principals {
      type        = "Federated"
      identifiers = [aws_iam_openid_connect_provider.github_actions_oidc.arn]
    }
    actions = ["sts:AssumeRoleWithWebIdentity"]
    condition {
      test     = "StringEquals"
      variable = "token.actions.githubusercontent.com:aud"
      values   = ["sts.amazonaws.com"]
    }
    condition {
      test     = "StringLike"
      variable = "token.actions.githubusercontent.com:sub"
      values   = ["repo:OrganizationName/RepoName:*"]
    }
  }
}

resource "aws_iam_role" "OrganizationName_RepoName_actions" {
  name               = "name"
  assume_role_policy = data.aws_iam_policy_document.repo_name_actions_trusted_entities.json
}

// iamにログイン後必要な権限を付与する
data "aws_iam_policy_document" "ecr_permissions" {
  statement {
    effect = "Allow"
    actions = [
      "ecr:GetAuthorizationToken"
    ]
    resources = ["*"]
  }
  statement {
    effect = "Allow"
    actions = [
      "ecr:BatchCheckLayerAvailability",
      "ecr:CompleteLayerUpload",
      "ecr:DescribeRepositories",
      "ecr:InitiateLayerUpload",
      "ecr:PutImage",
      "ecr:UploadLayerPart"
    ]
    resources = [format("arn:aws:ecr:%s:%s:repository/OrganizationName_RepoName_actions", data.aws_region.current.name, data.aws_caller_identity.current.account_id)]
  }
}

resource "aws_iam_role_policy" "OrganizationName_RepoName_actions" {
  policy = data.aws_iam_policy_document.ecr_permissions.json
  role   = aws_iam_role.gsskt_frontend_actions.id
}

workflowsの修正

上記の内容と同じ。

最後

実際github actionから使用する際にroleのarnを使用する必要がある。

例:

...
permissions:
  id-token: write
  contents: read
...

    - name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v4
      with:
        role-to-assume: arn:aws:iam::123456789100:role/my-github-actions-role
        aws-region: ap-northeast-1

doc

Discussion