AWS ↔ CircleCI OIDC 連携を Terraform で実現する


CircleCI OIDC を用いた AWS 連携の詳細は CircleCI が OIDC をサポート! 永続的な AWS Access Key を廃止できる! を御覧ください

Terraform での定義

IAM ID Provider を作成

<organization-id> には、 CircleCI の Organization ID を入力してください

locals {
  circleci_organization_id = "<organization-id>"
}

data "tls_certificate" "cirlceci" {
  url = "https://oidc.circleci.com"
}

resource "aws_iam_openid_connect_provider" "circleci" {
  url             = "https://oidc.circleci.com/org/${local.circleci_organization_id}"
  client_id_list  = [local.circleci_organization_id]
  thumbprint_list = data.tls_certificate.cirlceci.certificates.*.sha1_fingerprint
}

aws_iam_openid_connect_provider.circleci を作成する際、 data.tls_certificate.cirlceci を使って、サムプリントの計算を行っています。
AWSのドキュメントでサムプリントの方法が説明されていますが、 data source から、計算することができるので、この手順を省くことができます。

また、こうすることで、 CircleCI 側の証明書が変更された場合も、 terraform apply し直すことで、 ID Provider のサムプリントを新しい証明書のものに更新することができます。

Role の作成

aws_iam_openid_connect_provider.circleci を信頼ポリシーに含めたロールを作成します。
あとは、状況に応じてポリシーと紐付けてください。

resource "aws_iam_role" "cirlcleci_role" {
  name = "CircleCIRole"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect = "Allow"
      Action = "sts:AssumeRoleWithWebIdentity"
      Principal = {
        Federated = aws_iam_openid_connect_provider.circleci.arn
      }
    }]
  })
}

おわりに

AWS コンソールから ID Provider を追加する場合は、サムプリントの計算は不要ですが、コードから作成する場合はサムプリントを計算する必要があります。しかし、サムプリントは変わりうるものなので、直書きせず Terraform 上で計算したものを指定するのが良さそうに思えました。