目次
grasysの新井です。
今回はAzureのコンテナーサービスの一つ「Azure Container Instances」について特徴や構築方法をご紹介します。
Azure Container Instances(ACI)とは
サーバーレスなマネージドAzure環境内でコンテナーをオンデマンドで実行できるリソース。
仮想マシンをプロビジョニングする必要はなく、コマンド1つで簡単にコンテナを実行できる。
また数秒で起動し、稼働した秒単位で課金される。
特徴
- サーバーを管理することなくコンテナーを実行できる。
 - コンテナーグループを利用し、マルチコンテナーアプリケーションをデプロイできる。
 - ハイパーバイザー分離によってアプリケーションのセキュリティを保護できる。
 
できないこと
- ACI単体もしくはAzure Load Balancerでのオートスケーリングはできない。
→ Azure Kubernetes Service (AKS)と連携させることでロードバランシングを実現することはできる。 
- HTTPS通信をマネージドサービスで実現できない。
→ ユーザ自身がサイドカーコンテナーでプロキシサーバなどを建ててTLS/SSL化する必要がある。 
料金プラン
- 従量課金制
稼働したCPUとメモリに対して、秒単位に課金される。 
- コンピューディング用のAzure節約プラン
1年間もしくは3年間コンピュートリソースに対して時間単位の固定金額を支払うコミットをすることで、割引を受けることができる。 
実際に使ってみる

上記、構成図のような環境を構築していく。
ローカルPCからイメージをAzure Container Registryへpushし、Azure Container Instances側へデプロイしていく。
コンテナーグループ内ではphp-fpmコンテナーとサイドカーとしてnginxコンテナーを起動させる。
コンテナーグループとは?
同じホストコンピュータ上にスケジュール設定されるコンテナのコレクション。kubernatesのPodのようなもの。

参照元: https://learn.microsoft.com/ja-jp/azure/container-instances/container-instances-container-groups
構築手順
1. コンテナーレジストリを作成していく。
「コンテナレジストリ」で検索し該当リソースを開く。

必要な項目を入力する。

| 項目名 | 説明 | 
| サブスクリプション | リソース使用料などの支払い単位、かつリソースのスコープ単位。 リソースの論理コンテナー。  | 
| リソースグループ | 複数リソースをブループ化し管理するための仕組み。 | 
| レジストリ | ACRのリポジトリ名。 | 
| 場所(ロケーション) | サービスを稼働させる場所。 | 
| SKU | サービス階層。 Basic, Standard, Premiumに分かれており、すべて同じプログラム機能を有しているが、レジストリの容量や使用パターンによりオプションが分かれる。  | 
SKUの詳細: https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-skus
ネットワーク設定は今回publicで設定する。
プライベートネットワークを使用したい場合は、SKUをPremiumへアップグレードする必要がある。

ここまで完了したら、「確認および作成」ボタン→「作成」ボタンをクリックしレジストリを作成する。
2. ローカルでイメージを作成する
ディレクトリ構成
.
├── docker-compose.yml
├── container-group.yml
├── nginx
│   ├── Dockerfile
│   └── default.conf
└── php-fpm
    ├── Dockerfile
    └── src
        └── index.php
- nginx/default.conf
 
server {
    listen 80;
    server_name localhost;
    root  /var/www/html;
    index index.php index.html;
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
- nginx/Dockerfile
 
FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/default.conf
- php-fpm/Dockerfile
 
FROM php:8.2-fpm
COPY src /var/www/html
- php-fpm/src/index.php
 
<?php
phpinfo();
- docker-compose.yml
 
version: "3"
services:
  nginx:
    build: ./nginx
    tty: true
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
  php:
    build: ./php-fpm
    tty: true
    ports:
      - "9000:9000"
    volumes:
      - ./php-fpm/src:/var/www/html
イメージとタグを作成する。
# イメージ作成
$ docker-compose build
# タグ作成
$ docker tag blog-php:latest araiblog.azurecr.io/blog-php:latest
$ docker tag blog-nginx:latest araiblog.azurecr.io/blog-nginx:latest
# 作成したイメージを確認
$ docker images | grep blog               
araiblog.azurecr.io/blog-php   latest ac079c1f757b   About an hour ago   450MB
blog-php                       latest ac079c1f757b   About an hour ago   450MB
araiblog.azurecr.io/blog-nginx latest 9c520d1c109f   About an hour ago   142MB
blog-nginx                     latest 9c520d1c109f   About an hour ago   142MB
3. Azure Container Registry(ACR)へプッシュする。
Azure、ACRへログインする。
# azureへログイン
az login
# acrへログイン
# az acr login --name {{ REGISTRY_NAME }}
az acr login --name araiblog
イメージをACRへプッシュする。
# docker push <YOUR_ACR_NAME>.azurecr.io/blog-php:latest
$ docker push araiblog.azurecr.io/blog-php:latest
$ docker push araiblog.azurecr.io/blog-nginx:latest
レポジトリでホスティングされたことを確認する。
Azureポータルへログインし、「コンテナーレジストリ」を検索し、「リポジトリ」をクリックする。

4. コンテナーグループを作成する。
container-group.ymlを作成。
apiVersion: 2021-10-01
location: japanwest
# コンテナグループ名
name: araiBlogContainerGroup
properties:
  containers:
    - name: nginx
      properties:
                 # ACRのイメージを指定
        image: araiblog.azurecr.io/blog-nginx:latest
        resources:
          requests:
            cpu: 1
            memoryInGb: 1.5
        ports:
          - protocol: tcp
            port: 80
    - name: php
      properties:
                 # ACRのイメージを指定
        image: araiblog.azurecr.io/blog-php:latest
        resources:
          requests:
            cpu: 1
            memoryInGb: 1.5
        ports:
          - protocol: tcp
            port: 9000
     # ACRの管理者ユーザークレデンシャルを指定
  imageRegistryCredentials:
    - server: {{ LOGIN_SERVER }}
      username: {{ USER_NAME }}
      password: {{ PASSWORD }}
  osType: Linux
  restartPolicy: OnFailure
  ipAddress:
    type: Public
    ports:
      - protocol: tcp
        port: 80
  sku: Standard
type: Microsoft.ContainerInstance/containerGroups
今回のACRのクレデンシャルはAzureポータルの「コンテナーレジストリ」→「アクセスキー」内の管理者ユーザーを有効化した際のユーザー名とパスワードを利用する。

今回は管理者ユーザーのユーザ名とパスワードを利用するが、プロダクトを運用する場合はよりセキュアな認証としてマネージドIDやサービスプリンシパルを使用し、最低限の権限付与にする必要がある。
作成したcontainer-group.ymlを用いて、ACIへアプリケーションをデプロイしていく。
# az container create --resource-group {{ RESOURCE_GROUP_NAME }} --file {{ YAML_FILE }}
$ az container create --resource-group arai-container-instances --file container-group.yml
デプロイをWEBコンソールから確認する。

上記、ページに表示されているIPアドレスをブラウザへ入力し、表示を確認する。

まとめ
今回はAzure Container Instancesの構築方法やリソースの特徴を紹介してきました。普段、Dockerを利用していなくて手始めとして触れるにはよいリソースだと感じました。HTTPS通信をする場合はユーザ自身でSSL化しないといけないなど、ユーザ側で管理する手間がかかる部分はあるものの、Azure内でコンテナーを手軽に動かしてみたい場合の選択肢の一つにはなると思います。
機会があれば他のAzureコンテナーサービスも使用してみたいと思います。

      
    


