😀
GitHub ActionからAWSへのアクセス方法
githubからAWSを操作する際に、
一昔前まではクレデンシャルファイルをgithub上に保管し,運用するケースが多かったが。
今IDプロバイダーを使用した方がセキュリティ上優れてる観点から、主流になってるそうだ。
実際IDプロバイダーを利用するため、手順は下記三つが必要。
1.AWS上にIDプロバイダーを用意
2.AWS上にIAMロールを用意
3.Github上にworkflowにpermissionの設定を入れる
AWSコンソールから操作する場合とTerraform利用する場合の2つのやり方を紹介する。
AWSコンソールから
AWS上にIDプロバイダーの用意
コンソールからIAM
に移動し、左メニューバーのアクセス管理
からIDプロバイダ
を選択する
画面右にあるプロバイダを追加
ボタンを選択して追加を行う
プロバイダタイプ | OpenID Connect |
プロバイダURL | https://token.actions.githubusercontent.com |
対象者 | sts.amazonaws.com |
設定終わったら、プロバイダを追加
を選択するして、
github用のIDプロバイダー新規作られたことが確認できるはず。
AWS上に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
Discussion