課題
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