Terraform:使用存储在 AWS CodeCommit 中的版本化模块

Terraform: Using versioned modules stored in AWS CodeCommit

目前有一个 terraform 模块存储库存储在 AWS CodeCommit 中。在 Dev 和 Prod 之间,我们希望为模块使用相同的存储库,但能够让 Dev 和 Prod 使用不同的版本。

我已将标签附加到特定提交,以便更容易区分版本。但我似乎找不到任何关于如何引用该标签的文档。

我发现下面的示例说明了如何在 github

上完成
module "stage_vpc" {
  source = "git::git@github.com:gruntwork-io/module-vpc.git//modules/vpc-app?ref=v0.0.4"

  vpc_name         = "stage"
  aws_region       = "us-east-1"
  num_nat_gateways = 3
  cidr_block       = "10.2.0.0/18"
}

但尝试对 CodeCommit 做同样的事情似乎并不奏效。它报告“错误的响应代码:401”

正在尝试确定此 ?ref 是否是在 codecommit 中引用标记的正确方法。

https://git-codecommit.eu-west-1.amazonaws.com/v1/repos/reddwarf-terraform-infrastructure-modules/modules/subnets?ref=subnets-v0.0.1

任何人都可以确认这是否是正确的方法吗?或者有别的办法吗?

编辑:我现在已经按照安装指南创建了一个 SSH 密钥,并将其放入我的 IAM 用户中。

module "subnets" {
  source = "git::ssh://git-codecommit.eu-west-1.amazonaws.com/v1/repos/reddwarf-terraform-infrastructure-modules/Modules//subnets.git"

产生了以下错误

bobscutter@git-codecommit.eu-west-1.amazonaws.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

./ssh 文件夹存在正确的凭据,不确定我还缺少什么。我还检查了我可以从 Git Bash 连接并且它有效。

最终编辑:从 https 切换到 SSH 并根据 The AWS documentation

创建 ./ssh 目录后,现在可以正常工作了

我只需要在下面的路径中添加 // 而不是 /

  source = "git::ssh://git-codecommit.eu-west-1.amazonaws.com/v1/repos/reddwarf-terraform-infrastructure-modules//Modules//modules-orchestration//subnets

Terraform 成功找到并应用了模块。

为了解决这个问题,请按照 AWS documentation 设置 SSH 连接

然后使用下面的子网模块路径格式。

  source = "git::ssh://git-codecommit.eu-west-1.amazonaws.com/v1/repos/reddwarf-terraform-infrastructure-modules//Modules//modules-orchestration//subnets

然后在执行 Terraform init 之后,Terraform 成功获取了正确的模块。

此外,在使用名称 subnets-v0.0.1 标记提交并将其添加为参考后,您可以将部署锁定到特定提交。

  source = "git::ssh://git-codecommit.eu-west-1.amazonaws.com/v1/repos/reddwarf-terraform-infrastructure-modules//Modules//modules-orchestration//subnets?ref=subnets-v0.0.1"

对于任何来到这里想知道您是否可以使用 git-remote-codecommit 和 terraform 从 CodeCommit 克隆的人。答案是肯定的,你可以!

根据the terraform docs

Terraform installs modules from Git repositories by running git clone, and so it will respect any local Git configuration set on your system, including credentials.

这意味着只要您的 AWS 配置文件设置正确,您就可以使用以下任一格式将模块 source 设置为 codecommmit 存储库

  • codecommit://<profile>@<repository>
  • codecommit::<region>://<profile>@<repository>

它还通过 AWS_PROFILEAWS_DEFAULT_REGION

等环境变量进行配置

为了能够成功设置我的模块源,我必须这样定义它:

module = "example" {
  source.     = "git::codecommit::<region>://<repository-name>"
  example_var = "<fancy-var>"
  providers   = {
    aws = aws.<provider-alias>
  }

此外,在执行任何 terraform 命令之前,我必须导出在 codecommit 存储库上授予的 AWS_PROFILE,并且必须安装 @tedsmitt git-remote-codecommit 中提到的。