Azure ACR から AWS ECRにイメージを引越しさせる方法。

#はじめに

AzureやAWSにはコンテナイメージを保管しておくコンテナレジストリがあります。
業務では、プライベートなレジストリにコンテナイメージを保管し、アプリケーションを運用していると思います。
今回、AzureからAWSへのイメージの複製が必要だっため、検証としてローカル経由でのお引越しを行いました。

以下に該当する方に役立つお話かと思います。

・両方に同じコンテナイメージを用意する必要がある
・コンテナイメージを、一方から他方へお引越ししたい（Azure→AWS、AWS→Azure）

最終的にはCI連携させて、AZUREとAWS両方に自動でコンテナイメージをプッシュさせるようにしました。


#引越し方法

今回は、Azure ACRにオリジナルイメージがある状態から、「Azure ACR → ローカル → AWS ECR」という流れでお引越しします。
環境は、Windows10 WSL(Windows Subsystem for Linux / Ubuntu 16.04 LTS xenial)

##前提
・ローカルでdockerコマンドが使える
・azure-cli、aws-cliがインストール済み
・Azure ACR、AWS ECRの準備が整っている
・AzureとAWSの認証情報（アクセスキー関連）を取得済み

##必要な手順

・Azure ACRログイン
・Dockerログイン
・docker pull
・ローカルでイメージ確認
・AWS ECRログイン
・AWSエイリアス作成
・AWSプッシュ
・確認

##Azure ACRログイン

azログインします。

```
$ az login
```
認証が完了したらACRログイン

```
$ az acr login --resource-group <YOUR_RESOURCE_GROUP> --name <YOUR_ACR_REGISTRY_NAME>
 ↓
Login Succeeded
```

ACRのリポジトリへ接続する準備ができました。


#Azure ACRリポジトリ から 任意のイメージをdocker pull


ACRへ接続（dockerログイン）

```
$ docker login <YOUR_ACR_REGISTRY_NAME>.azurecr.io
　↓
Username (00000000-0000-0000-0000-000000000000): <YOUR_CLIENT_ID>
Password: <YOUR_CLIENT_SECRET>
Login Succeeded
```

ローカルにイメージをpull

```
$ REPO=<YOUR_REPOSITORY_NAME>
$ TAG=<YOUR_IMAGE_TAG>
$ docker pull <YOUR_ACR_REGISTRY_NAME>.azurecr.io/${REPO}:${TAG}
```

イメージができたことを確認

```
$ docker images | grep <YOUR_IMAGE_NAME>
　↓
<YOUR_ACR_REPOSITORY_NAME>.azurecr.io/<YOUR_IMAGE_NAME>      latest       bbf821c8427d       18 hours ago       879MB
```


#AWS ECRの認証と接続

AWSコンフィグでキーとか入力

```
$ aws configure
　↓
AWS Access Key ID [None]: <YOUR_ACCESS_KEY>
AWS Secret Access Key [None]: <YOUR_SECRET_KEY>
Default region name [ap-northeast-1]: <YOUR_REGION>
Default output format [json]: json
```

AWS ECRログイン

```
$(aws ecr get-login --no-include-email --region <YOUR_REGION>)
```
※ここでaws-cliのアップデートしてねってエラーが出ることがあるので、その場合は

```
$ sudo pip3 install awscli --upgrade --user
$ sudo -H pip install -U awscli
```
完了したらバージョンが指摘されたバージョン以上に上がっているか確認

```
$ aws --version
　↓
aws-cli/1.16.181 Python/3.5.2 Linux/4.4.0-43-Microsoft botocore/1.12.171
```

#AWS ECR用のエイリアス作成とイメージのpush

AWS ECR用のエイリアス作成
docker tagコマンドで「ACRイメージエイリアス」から「ECRイメージエイリアス」のエイリアスを作成する。

```
docker tag <YOUR_ACR_REGISTRY_NAME>.azurecr.io/${REPO}:${TAG} 123456789.sample.ap-northeast-1.amazonaws.com/${REPO}:${TAG}
````

エイリアスができたか確認

```
123456789.sample.ecr.ap-northeast-1.amazonaws.com/<YOUR_IMAGE_NAME> 　　  latest       bbf821c8427d      18 hours ago        879MB
<YOUR_ACR_REGISTRY_NAME>.azurecr.io/<YOUR_IMAGE_NAME>                   latest       bbf821c8427d      18 hours ago        879MB
```

AWS ECRプッシュ

```
docker push 123456789.sample.ap-northeast-1.amazonaws.com/${REPO}:${TAG}
```

AzureとAWSそれぞれでコンテナレジストリを確認しましょう。


#AWS ECR から Azure ACR へ引っ越しする場合。

基本的には、対象を逆にして、ECR docker pull 、エイリアス作成、 ACR docker pushにすればOKです。


#おまけ

検証完了後、実際に開発環境で運用する場合にはCIと連携させたいですよね。
私は、werckerというCIをGitと連携させています。
CIでACRとECR両方にイメージをプッシュし、gitにリリースタグ付け、スラック通知をするために以下のように設定を作成しています。
環境変数は適宜設定します。

要点は「internal/docker-push」を2回する感じですね。

```
box: busybox
no-response-timeout: 10
command-timeout: 10
build:
  steps:
    - script:
        name: echo
        code: |
          echo " ${WERCKER_GIT_REPOSITORY}"

maven:
　～　mavenのクリーンパッケージのステップを記載

docker:
  box: openjdk:8u171-jdk-alpine
  steps:
    #azure
    - internal/docker-push:
        azure-client-id: ${AZURE_CLIENT_ID}
        azure-client-secret: ${AZURE_CLIENT_SECRET}
        azure-subscription-id: ${AZURE_SUBSCRIPTION_ID}
        azure-tenant-id: ${AZURE_TENANT_ID}
        azure-resource-group: ${AZURE_ACR_RESOURCE_GROUP}
        azure-registry-name: ${AZURE_ACR_REGISTRY_NAME}
        azure-login-server: ${AZURE_ACR_REGISTRY_NAME}.azurecr.io
        repository: sample-repogitory
        tag: ${WERCKER_GIT_BRANCH}
        ports: 8080
        working-dir: ${WERCKER_SOURCE_DIR}
        entrypoint: ./entrypoint.sh -j sample-repogitory.jar
    #aws
    - internal/docker-push:
        aws-access-key: $AWS_ACCESS_KEY_ID
        aws-secret-key: $AWS_SECRET_ACCESS_KEY
        aws-region: $AWS_REGION
        aws-registry-id: $AWS_REGISTRY_ID
        repository: sample-repogitory
        tag: ${WERCKER_GIT_BRANCH}
        ports: 8080
        working-dir: ${WERCKER_SOURCE_DIR}
        entrypoint: ./entrypoint.sh -j sample-repogitory.jar
  after-steps:
    - slack-notifier:
        url: ${SLACK_WEBHOOK_URL_NOTIFY}
        channel: ${SLACK_ROOM_NOTIFY}
        username: "wercker notify (${WERCKER_GIT_REPOSITORY} : ${WERCKER_GIT_BRANCH})"

github:
  box: ubuntu:latest
  steps:
    - script:
        name: "install curl"
        code: |
          apt-get update && apt-get install -y curl
    - github-create-release:
        token: ${GITHUB_TOKEN}
        tag: ${WERCKER_GIT_BRANCH}
  after-steps:
    - slack-notifier:
        url: ${SLACK_WEBHOOK_URL_NOTIFY}
        channel: ${SLACK_ROOM_NOTIFY}
        username: "${WERCKER_GIT_REPOSITORY} : ${WERCKER_GIT_BRANCH} was created"

```

近々、CircleCIへの乗り換えを検討しているので、そちらも機会があれば書こうと思います。