TerraformでAWS CodeCommitのGit認証情報を生成してAWS Systems Manager Parameter StoreやAWS Secrets Managerに保存する

2022.07.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「Terraformで作ったCodeCommitのGit認証情報をいい感じに管理したい」

GitLabリポジトリをCodeCommitにミラーリングしたい時がありました。

以下の記事で設定できました。(感謝!)

GitLabのリポジトリをCodeCommitにミラーリングする流れとしては、以下になります。

  1. CodeCommit作成
  2. IAMポリシーとIAMユーザー作成
  3. CodeCommit Git認証情報の作成
  4. GitLabにてミラーリングの設定(Git認証情報をセット)

Terraformを使うにあたり、「3.CodeCommit Git認証情報の作成」の部分で作成するGit認証情報の管理すればいいんだろうと少し悩みました。

結論:

  • Git認証情報の作成: 「aws_iam_service_specific_credential」で作成可能
  • 認証情報の管理: SystemManager ParameterStoreかSecretsManagerに保存

サンプルコード交えて方法を紹介します。

やってみる

AWS CodeCommitのリポジトリ・IAM関連リソース・Git認証情報の作成

リポジトリとCodeCommit用のIAMユーザーとIAMグループ、Git認証情報を作成しています。

Git認証情報はaws_iam_service_specific_credentialで作成できます。

ちなみに、terraform-provider-aws v4.1.0(2022/2)以前ではCodeCommitの認証情報を作成することはできず、local-execを使用する必要がありました。

Feature request: IAM Service Specific credentials · Issue #3233 · hashicorp/terraform-provider-aws

main.tf

resource "aws_iam_user" "codecommit" {
  name = "codecommit-user"
  path = "/"
}

resource "aws_iam_user_group_membership" "codecommit" {
  user = aws_iam_user.codecommit.name

  groups = [
    aws_iam_group.codecommit.name,
  ]
}

resource "aws_iam_service_specific_credential" "codecommit" {
  service_name = "codecommit.amazonaws.com"
  user_name    = aws_iam_user.codecommit.name
}

resource "aws_iam_group" "codecommit" {
  name = "codecommit-group"
  path = "/"
}

resource "aws_iam_policy" "codecommit" {
  name        = "codecommit-group-policy"
  policy      = data.aws_iam_policy_document.codecommit.json
}

data "aws_iam_policy_document" "codecommit" {
  statement {
    effect    = "Allow"
    actions   = ["codecommit:GitPull", "codecommit:GitPush"]
    resources = ["arn:aws:codecommit:${data.aws_region.current.name}:${data.aws_caller_identity.current.id}:*"]
  }
}

resource "aws_iam_group_policy_attachment" "codecommit" {
  group      = aws_iam_group.codecommit.name
  policy_arn = aws_iam_policy.codecommit.arn
}

Git認証情報の登録

上記で、Git認証情報の作成ができました。

Outputsに出したりtfstateを確認すればGit認証情報は確認できますが、Systems Manager Parameter Storeや SecretsManagerに値を保存した方が管理しやすいかと思います。

どちらを使うかはお好みですが、それぞれ紹介します。

Systems Manager Parameter Store

resource "aws_ssm_parameter" "codecommit_username" {
  name        = "codecommit-username"
  type        = "SecureString"
  value       = aws_iam_service_specific_credential.codecommit.service_user_name
}

resource "aws_ssm_parameter" "codecommit_password" {
  name        = "codecommit-password"
  type        = "SecureString"
  value       = aws_iam_service_specific_credential.codecommit.service_password
}

SecretsManager

main.tf

resource "aws_secretsmanager_secret" "codecommit" {
  name = "codecommit-git-secrets"
}

resource "aws_secretsmanager_secret_version" "codecommit" {
  secret_id = aws_secretsmanager_secret.codecommit.id
  secret_string = jsonencode({
    "UserName" : aws_iam_service_specific_credential.codecommit.service_user_name,
    "Password" : aws_iam_service_specific_credential.codecommit.service_password,
  })
}

おわりに

個人的には、こういった情報(Git認証情報)はキーバリューで管理したいのでSecretsManagerを選ぶことが多いです。

SecretsManagerとParameter Storeの違いは以下がわかりやすいです。

Q: Secrets Manager と Parameter Store の違いは何ですか? AWS Systems Manager のよくある質問

以上、AWS事業本部の佐藤(@chari7311)でした。