🍣
GitHub ActionsでOIDCによるAWS認証をTerraformで実装する
概要
GitHub ActionsからOIDCを利用して各種クラウドインフラとの連携ができるようになって久しいです。
新しいプロダクトや環境などが立ち上がる度に「初期セットアップ周りってどうするんだっけ????」となるので、 N万番煎じですが IaCをまとめました。
なお、OIDC周りについて具体的にどのような仕組みで動いているかなどはこちらを参考にしてください。
実装
およそ以下の感じ。
Terraform
# see: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html
# see: https://github.com/aws-actions/configure-aws-credentials/issues/357#issuecomment-1011642085
data "tls_certificate" "github_actions" {
url = "https://token.actions.githubusercontent.com/.well-known/openid-configuration"
}
resource "aws_iam_openid_connect_provider" "github_actions" {
url = "https://token.actions.githubusercontent.com"
client_id_list = ["sts.amazonaws.com"]
# ref: https://qiita.com/minamijoyo/items/eac99e4b1ca0926c4310
# ref: https://zenn.dev/yukin01/articles/github-actions-oidc-provider-terraform
thumbprint_list = [data.tls_certificate.github_actions.certificates[0].sha1_fingerprint]
}
# GitHub Actions側からはこのIAM Roleを指定する
resource "aws_iam_role" "github_actions" {
name = "github-actions"
assume_role_policy = data.aws_iam_policy_document.github_actions.json
description = "IAM Role for GitHub Actions OIDC"
}
locals {
allowed_github_repositories = [
"foo",
"bar",
]
github_org_name = "my-organization"
full_paths = [
for repo in local.allowed_github_repositories : "repo:${local.github_org_name}/${repo}:*"
]
}
# see: https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#configuring-the-role-and-trust-policy
data "aws_iam_policy_document" "github_actions" {
statement {
actions = [
"sts:AssumeRoleWithWebIdentity",
]
principals {
type = "Federated"
identifiers = [
aws_iam_openid_connect_provider.github_actions.arn
]
}
# OIDCを利用できる対象のGitHub Repositoryを制限する
condition {
test = "StringLike"
variable = "token.actions.githubusercontent.com:sub"
values = local.full_paths
}
}
}
# 実際に利用する際にはこれに加えてdeny定義を追加付与するなどして、CI/CD用にカスタマイズすることを強く推奨
resource "aws_iam_role_policy_attachment" "admin" {
policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"
role = aws_iam_role.github_actions.name
}
GitHub Actions
およそ以下の感じ。
name: "Terraform Actions"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# see: https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#adding-permissions-settings
permissions:
id-token: write # This is required for requesting the JWT
contents: read # This is required for actions/checkout
jobs:
terraform_plan:
name: "Terraform Plan"
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1.7.0
with:
# Terraformから作成したIAM Role名を指定する
# see: https://github.com/aws-actions/configure-aws-credentials
role-to-assume: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/github-actions
aws-region: ap-northeast-1
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: 1.3.6
- name: Terraform Init
run: terraform init
- name: Terraform Plan
run: terraform plan
余談
後で知ったのですが、Terraformのmoduleも出ているようです。
GitHub Actionsでworkflowの共通化ができるようになったので、これを使うとCI/CD部分の定義を共通化できて嬉しくなりそうです。
Discussion