使用帕克,一个人如何建立一个亚马逊ECR实例远程
我想保存在亚马逊EC2注册神器码头工人的形象,通过封隔器(和ansible)内置
我的限制: 构建需要由Bitbucket管道触发。因此,构建步骤需要在Bitbucket管道本身或AWS EC2实例/容器中执行。
这是因为并非所有开发机器都必须具有从其本地环境构建的权限/软件包。我只希望将这些图像作为自动CI过程的结果来构建。
我曾尝试:
使用帕克,我能够远程建立的AMI。我可以使用Packer构建Docker镜像(本地构建并远程推送到Amazon ECR)。
但是,在Docker容器中执行构建步骤的Bitbucket管道已经无法访问docker守护进程'docker run'。
我在到位桶管道收到错误:
+ packer build ${BITBUCKET_CLONE_DIR}/build/pipelines_builder/template.json
docker output will be in this color.
==> docker: Creating a temporary directory for sharing data...
==> docker: Pulling Docker image: hashicorp/packer
docker: Using default tag: latest
docker: latest: Pulling from hashicorp/packer
docker: 88286f41530e: Pulling fs layer
...
...
docker: 08d16a84c1fe: Pull complete
docker: Digest: sha256:c093ddf4c346297598aaa13d3d12fe4e9d39267be51ae6e225c08af49ec67fc0
docker: Status: Downloaded newer image for hashicorp/packer:latest
==> docker: Starting docker container...
docker: Run command: docker run -v /root/.packer.d/tmp/packer-docker426823595:/packer-files -d -i -t hashicorp/packer /bin/bash
==> docker: Error running container: Docker exited with a non-zero exit status.
==> docker: Stderr: docker: Error response from daemon: authorization denied by plugin pipelines: Command not supported..
==> docker: See 'docker run --help'.
==> docker:
Build 'docker' errored: Error running container: Docker exited with a non-zero exit status.
Stderr: docker: Error response from daemon: authorization denied by plugin pipelines: Command not supported..
See 'docker run --help'.
==> Some builds didn't complete successfully and had errors:
--> docker: Error running container: Docker exited with a non-zero exit status.
Stderr: docker: Error response from daemon: authorization denied by plugin pipelines: Command not supported..
See 'docker run --help'.
==> Builds finished but no artifacts were created.
下面引用了一切(从link拍摄):
其他命令,如搬运工来看,目前禁止对于我们的共享构建基础结构中的 安全原因。
所以,我知道为什么会发生以下情况。这是我面临的限制。我知道我需要找到一个替代方案。
一种可能的解决方案: 我能想到的此刻,一个到位桶管道使用具有terraform和ansible安装在图像中,包含以下的唯一解决方案:
-
ansible本地:
- terraform申请(旋转加速从AMI实例/容器ansible和封隔器安装)
-
ansible远程(上述的实例)
- 克隆DEVOPS与封隔器构建脚本回购它
- 执行封隔器生成命令(建立命令取决于ansible,版本会创建EC2容器注册表图像)
-
ansible本地
- terraform破坏
上述解决方案是否可行?有替代品吗? Packer不能运行命令并从ECS中远程运行的容器提交?
我的长期解决方案是只使用bitbucket管道来触发AWS中的lambda函数,这将在我们的EC2容器注册表中启动容器并在那里执行构建。更多的控制,我们可以让开发人员从他们的机器触发lambda函数(具有更多的定制动态变量)。
我对你的问题来阻止你的理解,到位桶管道(通常称他们为agents
)没有足够的权限来完成这项工作(terraform apply
,packer build
)到您的AWS账户。
由于bitbucket管道代理正在Bitbucket云中运行,而不是在您的AWS账户(您可以为其分配IAM角色)上运行,因此您应该创建一个具有IAM角色的帐户(策略和权限如下)密钥(AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
和选项AWS_SESSION_TOKEN
)作为管道中的环境变量。
您可以参考有关如何将AWS凭据添加到到位桶管道
https://confluence.atlassian.com/bitbucket/deploy-to-amazon-aws-875304040.html
有了这个文件,你可以运行打包机或terraform命令没有问题。
对于需要分配运行packer build
,请参阅本文档的最低政策:
https://www.packer.io/docs/builders/amazon.html#using-an-iam-task-or-instance-role
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action" : [
"ec2:AttachVolume",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CopyImage",
"ec2:CreateImage",
"ec2:CreateKeypair",
"ec2:CreateSecurityGroup",
"ec2:CreateSnapshot",
"ec2:CreateTags",
"ec2:CreateVolume",
"ec2:DeleteKeypair",
"ec2:DeleteSecurityGroup",
"ec2:DeleteSnapshot",
"ec2:DeleteVolume",
"ec2:DeregisterImage",
"ec2:DescribeImageAttribute",
"ec2:DescribeImages",
"ec2:DescribeInstances",
"ec2:DescribeRegions",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSnapshots",
"ec2:DescribeSubnets",
"ec2:DescribeTags",
"ec2:DescribeVolumes",
"ec2:DetachVolume",
"ec2:GetPasswordData",
"ec2:ModifyImageAttribute",
"ec2:ModifyInstanceAttribute",
"ec2:ModifySnapshotAttribute",
"ec2:RegisterImage",
"ec2:RunInstances",
"ec2:StopInstances",
"ec2:TerminateInstances"
],
"Resource" : "*"
}]
}
为terraform plan/apply
,您需要分配最权限,因为terraform可以利用几乎所有AWS护理资源。其次,对于您现有的需求,您只需运行packer和terraform命令,不需要在bitbucket管道中运行docker命令。
因此,正常的管道与上述aws API环境,它应该直接工作。
image: hashicorp/packer
pipelines:
default:
- step:
script:
- packer build <your_packer_json_file>
您应该也可以在图像hashicorp/terraform
中运行terraform命令。
我想我会接近它是这样的:
- 有一个派克构建产生了“泊坞建立AMI”,你可以在EC2上运行。基本上它只是一个预装了Docker的AMI,再加上你需要的任何东西。该Packer build可以存储在另一个BitBucket Git仓库中,并且可以通过另一个BitBucket管道将该镜像构建并推送到EC2,以便对您的构建AMI进行的任何更改都会自动构建并推送为AMI。正如你已经建议的那样,在这里使用AWS Builder。
- 有一个Terraform脚本由您到位桶的管道叫起旋上述实例当前项目的一部分,“泊坞建设” AMI时,您的管道开始如
terraform apply
- 使用上述包装员Docker Builder EC2实例构建并将Docker镜像推送到ECR(应用您的Ansible脚本)。
- Terraform
destroy
环境一旦构建完成
这样做,保持对基础设施的一切作为代码,并要使其相当琐碎让你移动泊坞本地构建入到位桶的管道,如果他们提供运行支持docker run
在任何时候。
这是沿着我在想什么。当我开始实施它时,我会将其标记为已接受的答案(在下个月中如此) –
我已经成功地使用了Bitbucket Pipelines中的打包器和terraform(具有权限和所有设置)。只是在包装器template.json有一个类型为'docker'的构造器出现问题时,因为后台Packer实际上执行了docker run命令。我正在寻找一种方式让Packer在Bitbucket Pipelines环境之外构建Docker镜像(例如在EC2实例或容器中,以便它可以成功执行docker run命令,谢谢你的输入。) –
显示详细信息错误第一 – BMW
我编辑错误日志的问题:) –