我对 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机密中,仅针对一个帐户。
现在我不明白如何实现我的上述要求。我有以下想法:(请建议是否有更好的方法来做到这一点)
- 在 gitlab 机密中为每个相关 AWS 账户设置多个不同的信用
- 获取用户输入,指定他们想要在其中创建资源的 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"
}
- 然后在aws-s3-iam-combo.git
main.tf
以某种方式阅读信用account1来自 gitlab 的秘密。
现在我不知道如何实现上述目标,比如如何从 gitlab 读取所需的秘密变量等。
有人可以帮忙吗?