2017-08-30 92 views
0

我的问题:使用帕克,一个人如何建立一个亚马逊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函数(具有更多的定制动态变量)。

回答

0

我对你的问题来阻止你的理解,到位桶管道(通常称他们为agents)没有足够的权限来完成这项工作(terraform applypacker 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命令。

+0

我已经成功地使用了Bitbucket Pipelines中的打包器和terraform(具有权限和所有设置)。只是在包装器template.json有一个类型为'docker'的构造器出现问题时,因为后台Packer实际上执行了docker run命令。我正在寻找一种方式让Packer在Bitbucket Pipelines环境之外构建Docker镜像(例如在EC2实例或容器中,以便它可以成功执行docker run命令,谢谢你的输入。) –

+0

显示详细信息错误第一 – BMW

+0

我编辑错误日志的问题:) –

0

我想我会接近它是这样的:

  1. 有一个派克构建产生了“泊坞建立AMI”,你可以在EC2上运行。基本上它只是一个预装了Docker的AMI,再加上你需要的任何东西。该Packer build可以存储在另一个BitBucket Git仓库中,并且可以通过另一个BitBucket管道将该镜像构建并推送到EC2,以便对您的构建AMI进行的任何更改都会自动构建并推送为AMI。正如你已经建议的那样,在这里使用AWS Builder
  2. 有一个Terraform脚本由您到位桶的管道叫起旋上述实例当前项目的一部分,“泊坞建设” AMI时,您的管道开始如terraform apply
  3. 使用上述包装员Docker Builder EC2实例构建并将Docker镜像推送到ECR(应用您的Ansible脚本)。
  4. Terraform destroy环境一旦构建完成

这样做,保持对基础设施的一切作为代码,并要使其相当琐碎让你移动泊坞本地构建入到位桶的管道,如果他们提供运行支持docker run在任何时候。

+0

这是沿着我在想什么。当我开始实施它时,我会将其标记为已接受的答案(在下个月中如此) –