概要
AnsibleでAmazon Elastic Container Registry(ECR)にDocker ImageをPushする方法とハマリポイントを残したいと思います。
手順
下記の手順においては、実行環境にあらかじめAnsibleとDockerが導入されている前提とします
IAMポリシー作成と付与 → Dockerビルド → イメージPushの流れです
サンプルコード
以下の説明はこちらのサンプルコードをベースに説明しています
※aws/configとaws/credentialsファイルも忘れずに~
hosts
[local]
localhost ansible_connection=local
[local:vars]
region=ap-northeast-1
key_id=xxxxxxxxxxxxxx
access_key=xxxxxxxxxxxxxxx
image_name=hogehoge/fugafuga
image_version=latest
playbook
---
- 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: docker-py
state: present
- name: build docker image
docker_image:
path: ./
name: "{{ image_name }}"
tag: "{{ image_version }}"
- name: docker login
shell: "aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxx.dkr.ecr.ap-northeast-1.amazonaws.com"
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
1. IAMポリシーの作成と付与
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
にそれぞれ追加してください
2. AnsibleでDockerイメージのビルド
docker_imageモジュールを用いてDockerfileでイメージのビルドを行います
~~ 前略 ~~
- name: build docker image
docker_image:
path: ./
name: "{{ image_name }}"
tag: "{{ image_version }}"
3. Docker loginする(ECR経由)
--no-include-email
を入れないとunknown shorthand flag: 'e' in -e
でエラーになります(ハマリポイント)
get-loginで取得されるdocker login xxxxxx
に存在しないパラメータ(-e
)が含まれているため
get-loginは非推奨になりました。
また上記のような問題が解消されましたので、ダイアログに表示されたコマンドそのままでログインできます。
~~ 前略 ~~
- name: docker login
shell: "aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxx.dkr.ecr.ap-northeast-1.amazonaws.com"
4. ECSにリポジトリを作成
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
5. ECR用にタグ付け
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 }}"
6. イメージのpush
タグ付けしたイメージをプッシュする
~~ 前略 ~~
- name: push image to ecr
docker_image:
name: "{{ ecr_repo.repository.repositoryUri }}:{{ image_version }}"
push: yes