AnsibleでAmazon Elastic Container Registry(ECR)にDocker ImageをPushする方法とハマリポイントを残したいと思います。
下記の手順においては、実行環境にあらかじめAnsibleとDockerが導入されている前提とします
IAMポリシー作成と付与 → Dockerビルド → イメージPushの流れです
以下の説明こちらのサンプルコードをベースに説明しています
https://github.com/comefigo/ansible-push2ecr
[local]
localhost ansible_connection=local
[local:vars]
region=ap-northeast-1
key_id=xxxxxxxxxxxxxx
access_key=xxxxxxxxxxxxxxx
image_name=hogehoge/fugafuga
image_version=latest
---
- name: push docker image to AWS ECR Sample
hosts: local
tasks:
- name: make aws directory
file:
dest: ~/.aws
state: directory
mode: u=rwx,g=,o=
- name: copy aws config
template:
src: aws/config
dest: ~/.aws/config
mode: u=rw,g=,o=
- name: copy aws credentials
template:
src: aws/credentials
dest: ~/.aws/credentials
mode: u=rw,g=,o=
- name: install docker-py for build docker
pip:
name: boto3
state: present
- name: build docker image
docker_image:
path: ./
name: "{{ image_name }}"
tag: "{{ image_version }}"
- name: docker login (must `--no-include-email`)
shell: "$(aws ecr get-login --region {{ region }} --no-include-email)"
args:
executable: /bin/bash
- name: install boto3
pip:
name: boto3
state: present
- name: create repository
ecs_ecr:
name: "{{ image_name }}"
aws_access_key: "{{ key_id }}"
aws_secret_key: "{{ access_key }}"
region: "{{ region }}"
register: ecr_repo
- name: add tag
docker_image:
name: "{{ image_name }}:{{ image_version }}"
repository: "{{ ecr_repo.repository.repositoryUri }}"
tag: "{{ ecr_repo.repository.repositoryUri }}:{{ image_version }}"
- name: push image to ecr
docker_image:
name: "{{ ecr_repo.repository.repositoryUri }}:{{ image_version }}"
push: yes
ECRを操作するための権限(ポリシー)を作成します
以下のJSONデータをポリシー作成のJSONタブに貼り付けるか、作成画面で項目を選択してください
ひとまずすべて許可になっていますが、
必要に応じてAction
やResource
を絞ってください
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ecr:*",
"Resource": "arn:aws:ecr:*:*:repository/*"
}
]
}
操作できるリポジトリ、リージョン、アカウントIDなどを制限したい場合は、
以下の"Resource": "arn:aws:ecr:ap-northeast-1:xxxxxxxx:repository/yyyyyyyyyy"
という風にしてください
ポリシーの作成後に対象のIAMユーザに付与してください
※付与したユーザのアクセスキーとシークレットキーをhosts
のkey_id
とaccess_key
にそれぞれ追加してください
docker_imageモジュールを用いてイメージのビルドを行います
~~ 前略 ~~
- name: build docker image
docker_image:
path: ./
name: "{{ image_name }}"
tag: "{{ image_version }}"
--no-include-email
を入れないとunknown shorthand flag: 'e' in -e
でエラーになります(ハマリポイント)
get-loginで取得されるdocker login xxxxxx
に存在しないパラメータ(-e
)が含まれているため
~~ 前略 ~~
- name: docker login (must `--no-include-email`)
shell: "$(aws ecr get-login --region {{ region }} --no-include-email)"
もし、ansible.cfgでexecutable=/bin/bash -l
を設定している場合は、
argsで/bin/bash
を追加してください(ハマリポイント)
- name: docker login (must `--no-include-email`)
shell: "$(aws ecr get-login --region {{ region }} --no-include-email)"
args:
executable: /bin/bash
ecs_ecrモジュールはaws apiを用いるため、boto3をインストールします
~~ 前略 ~~
- name: install boto3
pip:
name: boto3
state: present
- name: create repository
ecs_ecr:
name: "{{ image_name }}"
aws_access_key: "{{ key_id }}"
aws_secret_key: "{{ access_key }}"
region: "{{ region }}"
register: ecr_repo
ECRの「プッシュコマンドの表示」で示されているようにタグ付け(手順4)をしていきます
前述のregister(ecr_repo)に格納されているrepositoryUri
を用います
~~ 前略 ~~
- name: add tag
docker_image:
name: "{{ image_name }}:{{ image_version }}"
repository: "{{ ecr_repo.repository.repositoryUri }}"
tag: "{{ ecr_repo.repository.repositoryUri }}:{{ image_version }}"
タグ付けしたイメージをプッシュする
~~ 前略 ~~
- name: push image to ecr
docker_image:
name: "{{ ecr_repo.repository.repositoryUri }}:{{ image_version }}"
push: yes