Более подробно об ответе jstewart379:
Основной способ справиться с этим - разрешить вашим экземплярам EC2 каким-либо образом получить доступ к этому хранилищу.
Чтобы это работало, ваш экземпляр Gitlab (а не репо) должен быть общедоступным или, по крайней мере, ему потребуется разрешить доступ к экземплярам EC2 (например, изменив группу безопасности Gitlab, чтобы разрешить порт80 и порт 443 доступ к группе безопасности экземпляра EC2).
После этого вы можете выбрать аутентификацию с помощью любого из методов, поддерживаемых вашим экземпляром Gitlab (обычно это SSH-ключ или HTTP-кредиты).
Для метода ключа SSH вы должны установить в Gitlab ключ развертывания только для чтения (не используйте ваш личный ключ SSH).
https://docs.gitlab.com/ee/ssh/#per-repository-deploy-keys
После этого вы можете установить этот ключ в экземпляре несколькими способами.Вы будете использовать опцию User-data вашей ASG для обработки всего этого.
Мой предпочтительный метод - загрузить ключ на экземпляр через зашифрованное, личное хранилище S3.
resource "aws_s3_bucket_object" "s3_object_deploy_key" {
key = "id_rsa"
bucket = "${aws_s3_bucket.s3_secrets.id}"
source = "secrets/id_rsa"
}
Важное примечание: Обязательно добавьте этот каталог секретов в .gitignore
, иначе у вас будет плохое время.
После загрузки ключак корзине предоставьте доступ только для чтения к этой корзине через роль экземпляра IAM.
Это выглядело бы примерно так:
resource "aws_iam_policy" "iam-policy-s3-deploy-key" {
name = "${var.cluster_name}-${var.env}-read-deploy-key"
path = "/"
description = "Allow reading from the S3 bucket"
policy = <<EOF
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:ListBucketByTags",
"s3:GetLifecycleConfiguration",
"s3:GetBucketTagging",
"s3:GetInventoryConfiguration",
"s3:GetObjectVersionTagging",
"s3:ListBucketVersions",
"s3:GetBucketLogging",
"s3:ListBucket",
"s3:GetAccelerateConfiguration",
"s3:GetBucketPolicy",
"s3:GetObjectVersionTorrent",
"s3:GetObjectAcl",
"s3:GetEncryptionConfiguration",
"s3:GetBucketRequestPayment",
"s3:GetObjectVersionAcl",
"s3:GetObjectTagging",
"s3:GetMetricsConfiguration",
"s3:GetIpConfiguration",
"s3:ListBucketMultipartUploads",
"s3:GetBucketWebsite",
"s3:GetBucketVersioning",
"s3:GetBucketAcl",
"s3:GetBucketNotification",
"s3:GetReplicationConfiguration",
"s3:ListMultipartUploadParts",
"s3:GetObject",
"s3:GetObjectTorrent",
"s3:GetBucketCORS",
"s3:GetAnalyticsConfiguration",
"s3:GetObjectVersionForReplication",
"s3:GetBucketLocation",
"s3:GetObjectVersion"
],
"Resource":[
"${data.terraform_remote_state.secret-store.s3_secrets_arn}",
"${data.terraform_remote_state.secret-store.s3_secrets_arn}/*"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ListAllMyBuckets",
"s3:HeadBucket"
],
"Resource":"*"
}
]
}
EOF
}
Вы бы настроили роль экземпляра, подобную этой, и назначьте ее для своей конфигурации запуска:
data "aws_iam_policy_document" "instance-assume-role-policy" {
statement {
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
}
}
resource "aws_iam_role" "iam-role-instance" {
name = "${var.cluster_name}-${var.env}-instance"
path = "/system/"
assume_role_policy = "${data.aws_iam_policy_document.instance-assume-role-policy.json}"
}
resource "aws_iam_role_policy_attachment" "iam-attach-deploy-key" {
role = "${aws_iam_role.iam-role-instance.name}"
policy_arn = "${aws_iam_policy.iam-policy-s3-deploy-key.arn}"
}
После полученияключ на месте, вы можете делать как угодно с хранилищем.
Надеюсь, это поможет!