Azure Container Registry Buildで作ったイメージをContainer Instancesで起動させる

Build 2018でACR Buildがプレビューリリースされたので試しました。
ついでに作ったイメージをContainer Instancesで起動させます。

# ACR Buildとは？
Azure Container Registryは、Dockerイメージを格納する為のプライベートレジストリです。
Dockerイメージを格納するためのものなので、どこか別の場所でDockerfileをビルドする必要がありました。
今回のリリースで、Azure CLIさえあれば、手元でdocker buildコマンドを実行する必要がなくなります。

# ACR作成
2018年5月時点でBuild機能が使えるリージョンは「米国東部」「ヨーロッパ西部」のみなのでどちらかで作成します。

* [リソースの作成]から「Container Registry」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8c34d258-b3d2-2592-f78b-40b8bfee0702.png)
<br>

* 管理者ユーザは有効化してください。SKUは最も安いBasicでよいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/43bb8921-eee8-0716-d0aa-483c6c769921.png)
<br>

# Dockerfile準備
ビルド対象のDockerfileを作っていきます。作成はCloud Shell上で行います。

* Cloud Shell Bashを選択します。手順は公式ページ参照。
[Cloud Shell クイックスタート](https://docs.microsoft.com/ja-jp/azure/cloud-shell/quickstart)

* 場所はどこでもいいんですが、File Storage上にDockerfileを作ることにします。Cloud Shellで以下のコマンドを実行します。

```
cd clouddrive
mkdir test
cd test
vi Dockerfile
```

* 今回はAWS CLIを実行するコンテナを作って、Azure Container InstancesからAWS EC2を操作してみたいと思います。
* 以下のDockerfileを作って保存します。

```dockerfile
FROM alpine:latest

RUN apk update && \
    apk add python py-pip jq && \
    pip install awscli
```

# ACR Build実行
* az acr buildコマンドでイメージをビルドして、ACRにPushします。

```
az acr build --registry kwhracrtest --image awscli:v1.0 .
```

※Cloud Shellではなくて自分でインストールしたAzure CLIを利用している場合は、az acr buildオプションが存在しないかもしれません。その場合は最新のAzure CLIをインストールしてください。

* ポータルのACR画面に戻り、[リポジトリ]を選択すると、先程ビルドしたイメージが格納されていることが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/09e117ee-2208-3dd7-b0fa-4aff15fe18c0.png)
<br>

# Container Instancesで実行する
それではこのACRに格納されたDockerイメージを使って、実際にコンテナを起動してみます。
今回試すのでAWS CLIなので、EC2を起動してみたいと思います。

* まずはACRからのイメージPullに必要なACR管理者ユーザ名とパスワードを控えておきます。ポータルのACRから[アクセスキー]を選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8cd56f8b-635d-bcf2-8d21-3fe45526b3b5.png)
<br>

* ユーザ名とパスワードが表示されるので控えておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/dffdfddc-4039-c012-b51e-37b93f659151.png)
<br>

* 今回はAWS CLIを使うので、EC2起動権限のあるIAMのアクセスキー、シークレットキーを事前に入手しておいてください。また、起動対象EC2のインスタンスIDも入手しておいてください。

* Cloud Shellで以下のコマンドを実行します。

```
az container create --name kwhrawscli \
    --image kwhracrtest.azurecr.io/awscli:v1.0 \
    --cpu 1 \
    --memory 1 \
    --registry-login-server kwhracrtest.azurecr.io \
    --registry-username kwhracrtest \
    --registry-password [Your ACR Password] \
    --ip-address public \
    -g kwhracrtest \
    --restart-policy Never \
    -e AWS_ACCESS_KEY_ID=[Your IAM AccessKey] \
       AWS_DEFAULT_REGION=ap-northeast-1 \
       AWS_SECRET_ACCESS_KEY=[Your IAM SecretKey] \
    --command-line \
      "aws ec2 start-instances --instance-ids [Your EC2 Ids]"
```

# 結果確認
* Azureポータルからコンテナーインスタンスを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ddd54c14-e5ef-6a0f-3b8a-898679c9dcd7.png)
<br>

* 先程実行したコンテナーインスタンスが作られているかと思いますので、それを選択します。
* [設定]-[コンテナー]の順に選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e15a6f13-6c07-ddd8-f5ae-d0f26286e22f.png)
<br>

* 結果が表示されています。ACRからイメージをPull→コンテナ作成→コンテナ起動→コンテナ破棄の順に動いていることが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/7a2c7f40-be27-0d3c-d8c9-12aacdf28517.png)
<br>

* コンテナの状態が「Terminated」になっているのは、今回作ったコンテナイメージが実行後すぐに破棄される作りになっているからです。「Terminated」になっている間は課金されません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/eba7d695-8272-c5cd-5954-d71933f372b6.png)
<br>

* AWS側を見てみても対象のインスタンスが無事起動していました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/190815b6-a5a1-134d-393e-fe629a880498.png)
<br>

# Container Instancesの料金は？
コンテナー実行時間に対して秒単位で課金されるようです。
[Container Instances料金](https://azure.microsoft.com/ja-jp/pricing/details/container-instances/)

今回の実行でいくら掛かったのか計算してみたいと思います。

イベントを見てみると、Pulling/Pulled/Created/Started/Killingと5つのステップが実行されており、それぞれ1秒で完了しています。
つまり実行時間は5秒となります。

az container createコマンドで、vCPU 1、メモリ 1GB と指定して実行しました。

以上より、条件式に当てはめると以下のような料金になります。

__メモリ使用時間__
1(コンテナーグループ) * 5(秒) * 1(GB) * 0.00056(円)
= 0.0028 円

__vCPU使用時間__
1(コンテナーグループ) * 5(秒) * 1(vCPU) * 0.001456(円)
= 0.00728 円

__課金合計__
0.0028 + 0.00728
= 0.01008 円

安いですね。
今回のケースでは問題ないですが、vCPU/メモリをそれなりのスペックで起動しっぱなしにした場合は、結構な金額になってしまうので注意が必要です。