📔

plumberをAzure Container Instancesで動かす

2024/10/27に公開

はじめに

前回Azure Container Instancesを試した際、イメージは公式のサンプルを使いました。

https://zenn.dev/arbr/articles/7ad259c4f6183d

今回は自分でBuildしたDockerコンテナを動かしてみました。題材として以前AWSの方で使っていたplumberを使います。

https://qiita.com/a_b_/items/dc4ccc2edc2c8e74fa78

概要

自作のコンテナをAzure Container Instancesで動かすために、以下の事を行いました。

  1. コンテナレジストリの作成
  2. ベースイメージのimport
  3. イメージのBuild
    • az acr buildだと、レジストリへのPUSHも一緒に行うようです
  4. コンテナインスタンスからコンテナレジストリにアクセスするための認証の設定
  5. コンテナインスタンスの作成

環境はAzure Cloud Shellを使用しています。
また、Azure Cloud Shellにはdockerコマンドが無かったため、az acrコマンドで行っています。

参考

https://qiita.com/tomohat/items/7a8cf5679ec82e1735bd

https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-tutorial-quick-task

やってみた

コード記述

まずはAzure Cloud Shellを実行します。Bashでストレージなし環境を使います。

コードを書いていきます。3つのファイルのコードは以下を使います。

https://qiita.com/a_b_/items/32cbc21bd140321719c2

# プロジェクトのディレクトリ作成
mkdir test-plumber && cd test-plumber

# 必要なファイルを作成
touch Dockerfile
touch plumber.R
touch sample.R

# コードを編集します。Azure Cloud Shellがクラシックに切り替わります。
code ./
Dockerfile
FROM r-base

COPY  sample.R /usr/local/src/
COPY  plumber.R /usr/local/src/

WORKDIR /usr/local/src/

# install the linux libraries needed for plumber
RUN apt-get update -qq && apt-get install -y \
  libsodium-dev \
  libcurl4-gnutls-dev

RUN R -e 'install.packages("plumber")'

EXPOSE 80

ENTRYPOINT ["Rscript", "plumber.R"]
plumber.R
library(plumber)
api <- plumber::plumb("sample.R")
api$run(host = "0.0.0.0", port=80)
sample.R
#* @get /hello
hw <- function() {
    return("Hello, world!")
}

#* @get /hello/<name>/<age:int>
hw <- function(name, age) {
    return(paste("Hello", name, "You're", age, "years old", seq=" "))
}

#* @get /fn
hw <- function(x) {
    x <- as.numeric(x)
    y <- 2 * x + 1
    return(y)
}

#irisを読み込み
df <- iris

#* @get /plot
#* @png
hw <- function() {
    p <- plot(df$Sepal.Length, df$Sepal.Width, 
        main="Sample plot", xlab="Sepal.Length", ylab="Sepal.Width")
    print(p)
}

レジストリにPUSH

次にリソースグループとコンテナレジストリを作ります。コンテナレジストリは作成時点で料金が発生します。一番安いBasicで作ります。

https://azure.microsoft.com/ja-jp/pricing/details/container-registry/

RES_GROUP=rg-for-plumber
ACR_NAME=forplumber

az group create --resource-group $RES_GROUP --location japaneast
az acr create --resource-group $RES_GROUP --name $ACR_NAME --sku Basic --location japaneast

次にベースとなるイメージであるr-baseを取得します。docker pullの代わりに、az acr importを使います。

https://learn.microsoft.com/ja-jp/cli/azure/acr?view=azure-cli-latest#az-acr-import

# イメージプル。imageオプションを指定しないと library/r-base で作られます
az acr import -n $ACR_NAME --source docker.io/library/r-base --image r-base:latest

# リポジトリ一覧から、r-baseがあることを確認します。
az acr repository list -n $ACR_NAME -o table

sample-plumberという名前でBuildします。

az acr build --image sample-plumber:v1 \
  --registry $ACR_NAME \
  --file ./Dockerfile .

認証

コンテナレジストリにアクセスする際は認証が必要になります。方法は複数あります。

https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-authentication?tabs=azure-cli

今回のコンテナインスタンスでは以下を使ってみました。
https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-auth-aci

サービスプリンシパルを作成して、ユーザIDとパスワードを変数に格納します。

SERVICE_PRINCIPAL_NAME=acr-service-principal
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)

コンテナ作成

その後、コンテナインスタンスを作成します。一部変数で扱っていないものもありますので、そこは適宜変更してください。

az container create \
    --resource-group $RES_GROUP \
    --name mycontainer \
    --image forplumber.azurecr.io/sample-plumber:v1 \
    --registry-login-server $(az acr show --name $ACR_NAME --query loginServer --output tsv) \
    --registry-username $USER_NAME \
    --registry-password $PASSWORD \
    --dns-name-label plumber-demo-k7K6feI6H7 --ports 80

コンソールからFQDNの文字列を確認し、http://[FQDNの文字列]/helloでアクセスできました。

その他、/hello/jiro/21の場合。

/fn?x=2の場合。

/plotの場合。

削除

色々作りましたので、リソースグループごと削除します。

az group delete --name $RES_GROUP

おわりに

今回はplumberをコンテナにしてコンテナレジストリにPUSHして、Azure Container Instancesで動かしてみました。
Dokcerコマンドを使わないでできると聞いてやってみたのですが、不慣れなためか若干使いにくかったです。
この記事がどなたかのお役に立てれば幸いです。

Discussion