LoginSignup
3
1

AzureContainerInstanesでCI/CDを使う

Last updated at Posted at 2023-03-29

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/CDCD(自動デプロイ) の方まで解説します.

環境説明

今回の解説では,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

リソースが立ち上がったら,設定のアクセスキーから「管理ユーザー」をオンにしてください.

image.png

そしたらその上の,「クイックスタート」に書いてある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移動して探してください👍
image.png

設定が終了したら作成.
以上で,Azure Container RegistryにPushしたImageをRunするコンテナが立ち上がってくれます.
立ち上がったあとは,リソースを見に行くと,ログが見れたり使用率にかんするメトリックも確認できます.

CI/CD設定

CIはよしなに各自Workflowに加えてください.
今回は,ネイティブでまだサポートされてないけど便利なので,Azure Container Registryへの自動PushとそれをAzure Container Instances側で読み取りなおして更新するCDを設定します.

Azure Active Directory

Azure Portalのハンバーガーに入ってます.
image.png

開いたら,「アプリの登録」を開いてください.
image.png

その後は,次の手順になります.

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の無料枠なくなったので,こっちで動かす分を作ってもいいなと思いました.

以上です.
メモ代わりなので,どっか間違ってたらすいません🍵

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1