きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × Angularなどの忘備録

Azure Container Registry × Azure Container Instances ×デプロイしてみた

この記事の目的

この記事では、
Azure DevOpsのPiplinesで
Azure Container Registry から Azure Container Instances への
デプロイを設定したときにはまったことのまとめ
を目的としています。


本題

★手順概要

ACRからACIにデプロイするときの手順は、
以下のドキュメントで丁寧に解説されています。
docs.microsoft.com


Azure CLIを使ってデプロイするためには
1)Azureキーコンテナを作成する
2)サービスプリンシパルを作成する
3)サービスプリンシパル情報をキーコンテナに格納する
4)3)の情報を使ってACIをデプロイする

という流れで実行します。


★はまったところ


わけもわからず、とりあえず実行した

一番やってはいけないことですが、
チュートリアルのコードをよく理解せぬまま実行してはまりました。
それぞれのステップで、どういう処理を実行しているのか知る必要があります。

反省をもとに、それぞれみていきます。

RES_GROUP=myresourcegroup # Resource Group name
ACR_NAME=myregistry # Azure Container Registry registry name 
AKV_NAME=mykeyvault # Azure Key Vault vault name 
#指定したリソースグループの中に、
#指定した名前のキーコンテナを作成。
az keyvault create -g $RES_GROUP -n $AKV_NAME

f:id:kinakomotitti:20190428054225p:plain
↑こんなリソースが作成される。

次に、2)と3)の処理を同時に実行します。
その手始めに、プリンシパルを作成し、
そのパスワードだけを先ほど作成したキーコンテナのシークレットに格納します。
格納された情報は、【$ACR_NAME-pull-pwd】というKeyで取得できます。

az keyvault secret set \
  --vault-name $AKV_NAME \
  --name $ACR_NAME-pull-pwd \
#az ad sp create-for-rbac のコマンドで
#サービスプリンシパルを作成する。
  --value $(az ad sp create-for-rbac \
                --name http://$ACR_NAME-pull \
     #作成するサービスプリンシパルの有効範囲を
     #指定したACRに対してのみに制限する↓
                --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
     #Pullできる権限を付与↓
                --role acrpull \
     #このコマンド実行では、とりあえずパスワードだけを
     #キーコンテナのシークレットに格納する↓
                --query password \
                --output tsv)


認証するためには、パスワードのほかにユーザーIDが必要になります。
そのため、次にユーザーID情報もキーコンテナのシークレットに登録します。
パスワードと同様に、この情報は【$ACR_NAME-pull-usr】というKeyで取得できます。

az keyvault secret set \
    --vault-name $AKV_NAME \
    --name $ACR_NAME-pull-usr \
    --value $(az ad sp show --id http://$ACR_NAME-pull --query appId --output tsv)

ここまでで、ACI作成時に、ACRにアクセスするための情報の設定が完了しました。
最後に、ACIを作成していきます。

az container create \
    --name aci-demo \
    --resource-group $RES_GROUP \
    --image $ACR_LOGIN_SERVER/aci-helloworld:v1 \
    --registry-login-server $ACR_LOGIN_SERVER \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-usr --query value -o tsv ) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-pwd --query value -o tsv ) \
    --dns-name-label aci-demo-$RANDOM \
    --query ipAddress.fqdn


Registry user name とpasswordに先ほど格納したキーコンテナのそれぞれのKeyを指定することで
ACRからイメージをPullすることができます。


★エラー①


実行しているサブスクリプションの違いによるエラー

こちらも初歩的な間違いですが、ACR、ACI用のリソースを用意していたサブスクリプション
ではない別のサブスクリプションでコマンドを実行していたため、リソースが見つからないエラーが起こっていました。
こちらの対応は2通りあります。

1)AZコマンド実行時に【--subscription】オプションをつけて実行する
2)【az account set --subscription "なにがし”】のコマンドを実行する

どちらでもOKですが、今実行しているサブスクリプションが何かを把握することが大事だと実感しました。
【az account show】コマンドで見ればいいのかな( ゚Д゚)


★エラー②


作成しようとしたリソースが対応していないローケーションだった…?

コマンドの内容、サブスクリプション問題を乗り越えた先に、このエラーが待ち構えていました。

ERROR: The requested resource is not available in the location 'japaneast' at this moment.
Please retry with a different resource request or in another location.
Resource requested: '1' CPU '1.5' GB memory 'Linux' OS

試しに、【--location eastasia】オプションをつけて実行したところうまく実行することができました。
なお、上記のエラーが発生したのは、Azure DevOpsのPiplinesからの実行のときでした。
同じコマンドをAzure CLIから実行したときには成功していました。

Piplinesで実行するAzure CLIのJobで指定しているオプションのせいなのか、何のせいなのか明確なことはわかりかねますが、暫定の対応方法としては、エラーメッセージの指示通りにロケーションを別の場所に変更することであると思います。



まとめ

チュートリアルだからといって、わけもわからずコマンドを実行しない
・Piplineでコマンド確認するのには待ち時間がかかるので、なにかしら工夫をする
例:Azure CLIを使って「動く」コマンドを作成する
  ただし、同じコマンドを使ってもPipline上で動くかどうかは定かではない

その他参考

  • AZコマンドについて

docs.microsoft.com

  • Azureキーコンテナについて

docs.microsoft.com