Как я могу развернуть хранилище с помощью Terraform - PullRequest
0 голосов
/ 18 октября 2018

Я не понимаю, как сделать клон git из моего частного репозитория gitlab в экземпляр ec2 при развертывании с использованием terraform.

У меня есть файл deploy.sh, где у меня есть:

sudo apt-get update
sudo apt-get install git
git clone git@gitlab.com:myapp/myrepo.git

Я использую ключ ssh для репозитория pull или push.

Как определить или зарегистрировать ключ ssh из нового экземпляра ec2, созданного из сценария terraform?

Я уже пытался использовать поставщик«file», но я использую ELB с группой автоматического масштабирования и не могу подключиться через ssh для копирования файлов с моего локального компьютера на новый экземпляр ec2, всегда получаю «порт 22: соединение отклонено».

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Более подробно об ответе 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}"
}

После полученияключ на месте, вы можете делать как угодно с хранилищем.

Надеюсь, это поможет!

0 голосов
/ 18 октября 2018

Когда вы предоставляете свой ресурс aws_autoscaling_group с помощью terraform, вы можете предоставить ему ресурс aws_launch_configuration и заполнить поле userdata сценарием, который вы хотите запустить при запуске экземпляра.Этот скрипт может сделать все, что вам нужно, включая клонирование репозитория gitlab и настройку ключей ssh.Для доступа ssh к машине вы можете настроить общедоступный экземпляр, с которого вы можете подключиться к вашему частному экземпляру, работающему за вашим elb.Настройки вашей группы безопасности могут сделать этот общедоступный экземпляр недоступным для всех, кроме вас.

Для предоставления файла Terraform: https://www.terraform.io/docs/configuration/interpolation.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...