如何使用Terraform部署存储库

时间:2018-10-17 21:56:38

标签: git terraform

当我使用terraform进行部署时,我不了解将私有gitlab存储库的git克隆到ec2实例中的方法。

我有一个deploy.sh文件,

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

我使用ssh键存储请求或推送存储库。

如何从Terraform脚本创建的新ec2实例中定义或注册ssh密钥?

我已经尝试使用预配器“文件”,但是我使用的是具有自动缩放组的ELB,并且我无法通过ssh连接将文件从本地计算机复制到新的ec2实例,总是会收到“端口22:连接被拒绝”

2 个答案:

答案 0 :(得分:0)

在为terraform配置aws_autoscaling_group资源时,可以为其提供aws_launch_configuration资源,并在实例启动时使用要运行的脚本填充userdata字段。该脚本可以执行您需要的任何操作,包括克隆gitlab存储库和设置ssh密钥。为了通过ssh访问计算机,您可以设置一个面向公众的实例,从该实例可以连接到在elb后面运行的私有实例。您的安全组设置可以使您以外的任何人都无法访问此公共实例。

用于向Terraform提供文件:https://www.terraform.io/docs/configuration/interpolation.html

答案 1 :(得分:0)

扩展jstewart379的答案:

处理此问题的基本方法是允许您的EC2实例以某种方式访问​​该存储库。

要使其正常工作,您的Gitlab实例(而非仓库)将需要公开,或者至少需要允许访问EC2实例(例如,通过修改Gitlab的安全组以允许端口80和端口443访问EC2实例安全组)。

之后,您可以选择通过Gitlab实例支持的任何方法进行身份验证(通常是SSH密钥或HTTP Creds)。

对于SSH密钥方法,您应该在Gitlab中设置一个只读的部署密钥(不要使用您的个人SSH密钥)。

https://docs.gitlab.com/ee/ssh/#per-repository-deploy-keys

此后,您可以选择通过多种方式在实例上安装此密钥。您将使用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}"
}

将密钥安装到位后,您可以根据需要使用存储库。

希望有帮助!