Я совершенно новичок в Terraforms и gitlab CI, и я кое-что пытаюсь здесь сделать.
Я хочу использовать Terraform для создания пользователя IAM и корзины S3. Использование политик разрешает определенные операции с этим сегментом S3 этому пользователю IAM. Сохраните учетные данные пользователя IAM в артефакте.
Теперь вышесказанное станет моим основным модулем.
Основной модуль выглядит примерно так:
Содержимое: aws-s3-iam-combo.git
(Учетные данные пользователя IAM, с помощью которых будет запускаться весь Terraform, скажем, admin-user , будут храниться в секретах 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
И тогда будет запущен конвейер, и когда это хранилище будет объединено с мастером, будут созданы ресурсы (пользователь S3 и IAM), и у пользователя будут иметь учетные данные этого пользователя IAM.
Теперь проблема в том, что у нас есть несколько учетных записей AWS. Так, скажем, если разработчик хочет создать S3 в определенной учетной записи, это было бы невозможно при вышеупомянутой настройке, так как admin-user , чьи кредиты хранятся в секретах 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 необходимую секретную переменную и т. Д.
Может кто-нибудь, пожалуйста, помогите здесь?