⌨️
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 上で計算したものを指定するのが良さそうに思えました。
Discussion