2017-08-30 64 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

這是沿着我在想什麼。當我開始實施它時,我會將其標記爲已接受的答案(在下個月中如此) –