grasys blog

Azure Container Instancesを使ってみた

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コンテナーサービスも使用してみたいと思います。


採用情報
お問い合わせ