Azure Container Instancesを使ってみた
目次
- Azure Container Instances とは
- 環境説明
- リソース設定
- Azure Container Registry
- Azure Container Instances
- CI/CD設定
- Azure Active Directory
- Workflow解説
- 後書き
Azure Container Instances とは
Azure Container Instances はAzureが提供する「サーバーレスでDockerコンテナを作成&実行」出来るリソースのことです.
詳しくはコチラ
Docker Commandで起動させられる環境であれば,難なくすぐにデプロイ出来ます.
今回は,Dockerで起動が出来るBotの動作環境として CI/CD の CD(自動デプロイ) の方まで解説します.
環境説明
今回の解説では,Docker Image はPyhonで動くBotと仮定して説明します.
Dockerfile(by ChatGPT)
# ベースイメージとしてPython 3.9を使用
FROM python:3.9
# 作業ディレクトリを設定
WORKDIR /app
# 環境変数を設定して、Pythonがファイルを直接実行する際にバッファリングを無効にする
ENV PYTHONUNBUFFERED=1
# pipをアップグレードし、Pipenvをインストール
RUN pip install --upgrade pip && \
pip install pipenv
# Pipfileをコピー
COPY Pipfile ./
# Pipenvを使ってモジュールをインストール
RUN pipenv install --deploy --system
# すべてのファイルをコピー
COPY . .
# コンテナ内でアプリケーションを実行するコマンド
CMD ["python", "app.py"]
pipfile(by ChatGPT)
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
flask = "*"
[requires]
python_version = "3.9"
build command
docker build -t boku-pyhon .
docker run -p 80:80 boku-pyhon
Azure Container Instancesは デフォルトで port:80 をリッスンするので,そのようにBot側を設定すると良いです.
リソース設定
必要なリソース作って行きます.
Azure Container Registry
リソースが立ち上がったら,設定のアクセスキーから「管理ユーザー」をオンにしてください.
そしたらその上の,「クイックスタート」に書いてあるcommandを実行していきながら進めます.
今回は,上で出したDockerfileをbuildされたImageをpushする過程で進めます.
docker login reponame.azurecr.io
docker tag boku-pyhon reponame.azurecr.io/boku-pyhon:latest
docker push reponame.azurecr.io/boku-pyhon:latest
Azure Container Registryについては設定終了.
Azure Container Instances
これっす
https://azure.microsoft.com/ja-jp/products/container-instances
これはなんとなくではなく,設定項目の途中でImage選択を「Azure Container Registry」に設定し,その後自分がさっきPushしたImageを選択してください.環境変数も設定する欄があるので,Tab移動して探してください👍
設定が終了したら作成.
以上で,Azure Container RegistryにPushしたImageをRunするコンテナが立ち上がってくれます.
立ち上がったあとは,リソースを見に行くと,ログが見れたり使用率にかんするメトリックも確認できます.
CI/CD設定
CIはよしなに各自Workflowに加えてください.
今回は,ネイティブでまだサポートされてないけど便利なので,Azure Container Registryへの自動PushとそれをAzure Container Instances側で読み取りなおして更新するCDを設定します.
Azure Active Directory
その後は,次の手順になります.
1.既存のサービスプリンシパルを選択するか、新しいアプリケーションを登録してサービスプリンシパルを作成します。
2.アプリケーションの詳細ページで、クライアントID(アプリケーションID)とディレクトリID(テナントID)をメモします。
3.左側のメニューで、「証明書とシークレット」を選択し、「新しいクライアントシークレット」を作成します。シークレットの値をメモしておきます。この値は、ページを離れると再度表示できなくなります。
4.Azureポータルで、サービスプリンシパルにリソースグループへの「Contributor」ロールを割り当てます。
(Azure Container Instancesm, Azure Container Registryの入ったリソースグループを開いて設定します.)
そしたらメモした情報をjsonにして構えときます.
{
"clientId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"clientSecret": "xxxxxxxxxxxxxxxxx",
"subscriptionId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenantId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
CDしたいアプリが入ったGithubのレポジトリのSettingsから,Secretsに「AZURE_CREDENTIALS」という名前で設定します.
(Workflowで使うだけなので名前は何でもイイです.)
workflow解説
書いてある通りで,一部Azure Container Registryの名前やユーザー情報,パスワードなどもSecretsに入れる必要があります.
あ,あと一つ前で作成したCredentialsや,その中のIDなども設定が必要でした.
(AZURE_CLIENT_ID,AZURE_CLIENT_SECRET,AZURE_TENANT_IDの所)
わからないところはChatGPTにこのファイルを投げて聞いてみてください.
name: For boku-python CI/CD with ACR and ACI
on:
push:
branches:
- main
jobs:
build_and_push:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Azure Container Registry
uses: docker/login-action@v1
with:
registry: ${{ secrets.ACR_NAME }}.azurecr.io
username: ${{ secrets.ACR_USERNAME }}
password: ${{ secrets.ACR_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: ${{ secrets.ACR_NAME }}.azurecr.io/boku-python:latest
deploy:
runs-on: ubuntu-latest
needs: build_and_push
steps:
- name: Login to Azure CLI
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Deploy to Azure Container Instances
run: |
RESOURCE_GROUP=rg-boku-python
CONTAINER_NAME=container-boku-python
IMAGE_NAME=boku-python
# Pull the latest image
az acr login --name ${{ secrets.ACR_NAME }}
docker pull ${{ secrets.ACR_NAME }}.azurecr.io/$IMAGE_NAME:latest
# Create or update the container instance
az container create \
--resource-group $RESOURCE_GROUP \
--name $CONTAINER_NAME \
--image ${{ secrets.ACR_NAME }}.azurecr.io/$IMAGE_NAME:latest \
--registry-username ${{ secrets.ACR_USERNAME }} \
--registry-password ${{ secrets.ACR_PASSWORD }} \
--dns-name-label $CONTAINER_NAME \
--restart-policy Always \
- name: Restart container
run: |
az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
az container restart --resource-group rg-boku-python --name boku-python
以上でWorkflowの設定も終了です.
後書き
自分は良くApp ServiceやStatic Web App を使っているので,今回の経験でネイティブでCDがサポートされている有り難みを噛み締めました.(AAD設定のところとか少し面倒くさかったです.)
また,サーバレスでコンテナを使えるのはめちゃ便利だなーと感じたのでこれからも機会があれば最小構成で遊んでみようかなと思います.
Herokuの無料枠なくなったので,こっちで動かす分を作ってもいいなと思いました.
以上です.
メモ代わりなので,どっか間違ってたらすいません🍵