在 Terraform 中引用 gitlab 秘密

2024-03-25

我对 Terraforms 和 gitlab CI 很陌生,我想用它来做一些事情。

我想使用 Terraform 创建 IAM 用户和 S3 存储桶。使用策略允许该 IAM 用户对此 S3 存储桶执行某些操作。将 IAM 用户的凭证保存在工件中。 现在以上将是我的核心模块。

The 核心模块看起来像下面这样:

内容:aws-s3-iam-combo.git

(运行所有 Terraform 的 IAM 用户的凭据,例如管理员用户,将存储在 gitlab 秘密中。)

main.tf

resource "aws_s3_bucket" "bucket" {
  bucket = "${var.name}"
  acl = "private"
  force_destroy = "true"

  tags {
    environment = "${var.tag_environment}"
    team        = "${var.tag_team}"
  }

  policy =<<EOF
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "${aws_iam_user.s3.arn}"
      },
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::${var.name}",
        "arn:aws:s3:::${var.name}/*"
      ]
    }
  ]
}
EOF
}

resource "aws_iam_user" "s3" {
  name = "${var.name}-s3"
  force_destroy = "true"
}

resource "aws_iam_access_key" "s3" {
  user = "${aws_iam_user.s3.name}"
}

resource "aws_iam_user_policy" "s3_policy" {
  name = "${var.name}-policy-s3"
  user = "${aws_iam_user.s3.name}"
  policy =<<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::${var.name}",
        "arn:aws:s3:::${var.name}/*"
      ]
    }
  ]
}
EOF
}

outputs.tf

output "bucket" {
  value = "${aws_s3_bucket.bucket.bucket}"
}

output "bucket_id" {
  value = "${aws_s3_bucket.bucket.id}"
}

output "iam_access_key_id" {
  value = "${aws_iam_access_key.s3.id}"
}

output "iam_access_key_secret" {
  value = "${aws_iam_access_key.s3.secret}"
}

variables.tf

variable "name" {
  type = "string"
}

variable "tag_team" {
  type = "string"
  default = ""
}

variable "tag_environment" {
  type = "string"
  default = ""
}

variable "versioning" {
  type = "string"
  default = false
}

variable "profile" {
  type = "string"
  default = ""
}

组织中现在需要创建 S3 存储桶的任何人都需要创建一个新的存储库,其形式如下:

main.tf

module "aws-s3-john-doe" {
  source = "git::https://git@gitlab-address/terraform/aws-s3-iam-combo.git?ref=v0.0.1"
  name = "john-doe"
  tag_team = "my_team"
  tag_environment = "staging"
}

gitlab-ci.yml

stages:
  - plan
  - apply

plan:
  image: hashicorp/terraform
  stage: plan
  script:
    - terraform init
    - terraform plan

apply:
  image: hashicorp/terraform
  stage: apply
  script:
    - terraform init
    - terraform apply
  when: manual
  only:
    - master

然后管道将触发,当此存储库合并到 master 时,将创建资源(S3 和 IAM 用户),并且用户将拥有此 IAM 用户的凭证。

现在的问题是我们有多个AWS账户。因此,如果开发人员想要在某个帐户中创建 S3,则上述设置是不可能的管理员用户,其信用记录在gitlab机密中,仅针对一个帐户。

现在我不明白如何实现我的上述要求。我有以下想法:(请建议是否有更好的方法来做到这一点)

  1. 在 gitlab 机密中为每个相关 AWS 账户设置多个不同的信用
  2. 获取用户输入,指定他们想要在其中创建资源的 AWS 账户作为变量。所以说:

main.tf

module "aws-s3-john-doe" {
  source = "git::https://git@gitlab-address/terraform/aws-s3-iam-combo.git?ref=v0.0.1"
  name = "john-doe"
  tag_team = "my_team"
  tag_environment = "staging"
  aws_account = "account1"
}
  1. 然后在aws-s3-iam-combo.git main.tf以某种方式阅读信用account1来自 gitlab 的秘密。

现在我不知道如何实现上述目标,比如如何从 gitlab 读取所需的秘密变量等。

有人可以帮忙吗?


你不久前问过这个问题,但也许我的想法仍然对其中一个或另一个有帮助......

你可以这样做envsubst(需要包装gettext安装在您的运行器上或用于运行管道的 Docker 映像中)。

这是一个例子:

首先,在项目设置中将不同的用户帐户设置为环境变量(项目秘密:

SECRET_1: my-secret-1
SECRET_2: my-secret-2
SECRET_3: my-secret-3

然后,创建一个包含 Terraform 变量的文件,我们将其命名为vars_template.tf:

variable "gitlab_secrets" {
    description = "Variables from GitLab"
    type = "map"
    default = {
        secret_1 = "$SECRET_1"
        secret_2 = "$SECRET_2"
        secret_3 = "$SECRET_3"
    }
}

在 CI 管道中,您现在可以配置以下内容:

plan:dev:
  stage: plan dev
  script:
    - envsubst < vars_template.tf > ./vars_envsubst.tf
    - rm vars_template.tf
    - terraform init
    - terraform plan -out "planfile_dev"
  artifacts:
    paths:
      - environments/dev/planfile_dev
      - environments/dev/vars_envsubst.tf

apply:dev:
  stage: apply dev
  script:
    - cd environments/dev
    - rm vars_template.tf
    - terraform init
    - terraform apply -input=false "planfile_dev"
  dependencies:
    - plan:dev

需要注意的是,原来的vars_template.tf必须删除,否则 Terraform 将抛出该变量被多次定义的错误。您可以通过将模板文件存储在 Terraform 工作目录之外的目录中来规避此问题。 但从 Terraform 状态中您可以看到变量值已正确替换:

"outputs": {
    "gitlab_secrets": {
        "sensitive": false,
        "type": "map",
        "value": {
            "secret_1": "my-secret-1",
            "secret_2": "my-secret-2",
            "secret_3": "my-secret-3"
        }
    }
}

然后您可以使用以下方式访问这些值"${vars.gitlab_secrets["secret_1"]}"在您的 Terraform 资源等中。

UPDATE:请注意,此方法会将机密存储在 Terraform 状态文件中,如果该文件存储在 S3 存储桶中以便与 Terraform 协作,则可能会出现潜在的安全问题。存储桶至少应该被加密。此外,建议使用 ACL 限制对文件的访问,例如,只有一个用户地形可以访问它。当然,用户可以通过 Terraform 泄露秘密outputs...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Terraform 中引用 gitlab 秘密 的相关文章

随机推荐

  • 如何将工作表保存到新工作簿?

    我正在尝试将单个工作表保存到新工作簿 VBA 应该创建一个新工作簿 代码正在运行 新工作簿会弹出 其中包含所需的数据 并且 另存为 对话框窗口也会打开 但是当我选择名称并保存文件时 找不到新工作簿保持打开状态 Book1 或无论自动填充什么
  • 如何在Python中的recv之前找出socket中有多少字节?

    我有一个处理数据流的 TCP 它一次需要 4096 个字节 但我需要一种方法在接收之前找出整个套接字的大小 这样我就可以确定在切换套接字之前套接字将被读取多少次 它还会通知这是该套接字的最后一次接收 以便我可以在选择切换到另一个套接字 当它
  • SSL 启用:Windows 7 中的 Tomcat [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当我尝试在 Windows 7 中启用 SSL 编辑 server xml 以启用端口 8443 作为 HTTPS 时 它没有被启用 有时它会显示 连
  • 列出两个日期之间的天数数组

    我想列出两个日期之间的一系列天数 我可以使用下面的代码列出一系列月份 我如何更改它以显示两个日期之间的每一天 require date date from Date parse 2011 05 14 date to Date parse 2
  • 自定义视图引擎中的 ASP.NET MVC 自定义属性

    假设我写了一个自定义属性 public class SpecialActionFilterAttribute System Web Mvc ActionFilterAttribute public override void OnActio
  • 如何将 grep 的输出通过管道传输到 cp?

    我有一个工作grep选择满足特定条件的文件的命令 我怎样才能从grep命令并将其通过管道传输到cp命令 以下尝试都失败了cp end grep r TWL exclude csv cp data lidar tmp ajp2 cp 之后缺少
  • 用于 SSO 的 PHP + ADFS(通过 OAuth) - 如何设置 ADFS?

    我正在尝试使用ADFS for SSO在一个项目上 该项目正在进行中PHP我正在尝试使用OAuth为了这 那么设置 ADFS 以与 OAuth2 配合使用的步骤是什么 我对 ADFS 一无所知 也无法在那里获得有关 OAuth2 设置的任何
  • 使用 -static-libgcc 和 -static-libstdc++ 编译 libconfig++

    我正在尝试编译库配置 http www hyperrealm com libconfig 版本 1 4 8 与 make LDFLAGS static libstdc static libgcc 但这似乎不起作用 因为我仍然得到 reade
  • 无法使用 Gradle 运行 TestNG

    我有一个使用 TestNG 运行的简单代码 但我无法使用 Gradle 运行相同的代码 因为它说找不到 main 方法 这并不奇怪 因为我使用的是注释 但在这样的场景下 如果我必须使用Gradle 如何运行代码 请注意 我对 Gradle
  • 如何根据 Django 中的表单输入向用户显示生成的图像?

    我目前正在使用对象的属性通过 matplotlib 生成图像 并且能够创建一个在 HttpResponse 中显示所述图像的视图 我使用以下代码片段来执行此操作 http wiki scipy org Cookbook Matplotlib
  • Pandas - KeyError:列不在索引中[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 import pandas as pd import quandl df quandl get WIKI GOOGL p
  • 如何将 MKMapView 用户位置蓝点更改为所选图像?

    是否可以更改blue dot https i stack imgur com ELWID jpg这表明用户的位置MKMapView到图像 例如一辆小汽车或任何 png image In the 查看注释 的方法MKMapViewDelega
  • 循环引用时 .NET 单元测试中的 StackOverflow

    当我注意到以下情况时 我正在测试其他循环参考电阻 public class Foo private Bar myBar new Bar public class Bar private Foo myFoo new Foo Fact publ
  • “pointer-events: none”在 IE9 和 IE10 中不起作用

    CSS 属性pointer events none 在 Firefox 中工作正常 但在 Internet Explorer 9 10 中则不然 有没有办法在 IE 中实现该属性的相同行为 有任何想法吗 来自 MDN 文档 警告 在 CSS
  • React:检查器不是一个函数

    我在 React 应用程序的控制台中收到这条奇怪的警告消息 警告 Failed propType checker is not a function 检查渲染方法Chart 我根本没有任何检查方法 如果我删除我的propTypes 警告消失
  • 姜戈 1.5。 'url' 需要一个非空的第一个参数。 Django 1.5 中的语法发生了变化

    如果我尝试 href url post content product id p id 我有这个错误 url 需要一个非空的第一个参数 语法发生了变化 Django 1 5 请参阅文档 如何改变呢 Django 1 5 中的更改 第一个参数
  • Unity中协程的异常处理

    我创建了一个脚本来更改它所附加的游戏对象的透明度 并且我在需要可取消的淡入淡出协程中进行透明度更改 并且每次我们调用时都取消 ChangeTransparency 具有新的值 我设法让它按照我想要的方式工作 但我想处理OperationCa
  • SQLite 比 MySQL 更快?

    我想设置一个 teampeak 3 服务器 我可以选择 SQLite 和 MySQL 作为数据库 好吧 我通常倾向于 不要在生产中使用 SQLite 但另一方面 它是一个 Teamspeak 服务器 好吧 让我谷歌一下 我发现了这个 Spe
  • FOSUserBundle 一对一映射实体未保存

    大家好 我有一个关于在实体 FosUserBundle 中实现一对一的问题 用户实体与配置文件实体具有一对一的映射 我已经按照 FOSUserBundle 文档中所示覆盖了基本的 RegistrationFormType 记录也保存在两个表
  • 在 Terraform 中引用 gitlab 秘密

    我对 Terraforms 和 gitlab CI 很陌生 我想用它来做一些事情 我想使用 Terraform 创建 IAM 用户和 S3 存储桶 使用策略允许该 IAM 用户对此 S3 存储桶执行某些操作 将 IAM 用户的凭证保存在工件