「Terraformで作ったCodeCommitのGit認証情報をいい感じに管理したい」
GitLabリポジトリをCodeCommitにミラーリングしたい時がありました。
以下の記事で設定できました。(感謝!)
GitLabのリポジトリをCodeCommitにミラーリングする流れとしては、以下になります。
- CodeCommit作成
- IAMポリシーとIAMユーザー作成
- CodeCommit Git認証情報の作成
- 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)でした。