当我使用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:连接被拒绝”
答案 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}"
}
将密钥安装到位后,您可以根据需要使用存储库。
希望有帮助!