Azure Container Apps のMSIを試す

8642 ワード

概要

今朝起きたら、ACA[1]の更新が出てると教えもらい。どうやら、MSI(待望の)がサポートされるようになった[2]らしいと聞き、ちょっと試してみた。

コードはgithub:aca-msi01に置いた。

MSI自体は、Azureの他のリソースと違いは無く同じような感じでデプロイできるので、あまり言うことはなく。少し配慮する点があるので、それだけをメモとして残しておく。

デプロイとRole Assignment

MSI(System Managed Identity)は、'Microsoft.App/containerApps(以下アプリ) と、アクセス対処のリソースを繋ぐ形になる。アプリは、1つもしくは復数のコンテナで構成され[3]、構成の変更や増減は割と頻繁に行なわれることが想定される。どのアプリがどのリソースにアクセスすることを許可するかは、MSIで決めるという位置付けにする。なので、今回は、アプリをデプロイするモジュールcontainer.bicepと、割当て(Role Assignments)を行うモジュールroleAssignment.bicepを分け、デプロイはこの2つをまとめてmain.bicepで行うようにした。

main.bicep
module containerApps 'container.bicep' = {
  name: 'containerApps'
  params: {
    location: location
    containerAppName: containerAppName
    containerImage: containerImage
....
    transport: transport
    allowInsecure: allowInsecure
    env: env
    acrName: acrName
  }
}

module roleAssignment 'roleAssignment.bicep' = {
  name: 'roleAssignment'
  params: {
    roleDefinitionResourceId: role.id
    containerAppPrincipalId: containerApps.outputs.principalId
    containerAppResourceId: containerApps.outputs.id
    storageAccountName: storageAccountName
  }
}

この書き方だと、異なったリソースへのアクセス権をもったアプリを同じbicepでデプロイ出来ないので、もう少し工夫する必要があるように思うが。とりあえず、こうしておけば、az cli 一発でデプロイできる。

こんな感じ

Makefile
deploy-apps:		## deploy msi check app
	envsubst < web/env.json.template > web/env.json
	az deployment group create -g $(RESOURCE_GROUP) -f ./deploy-app/main.bicep \
	-p \
	containerAppName=msicheck \
	environmentName=$(ENVIRONMENT_NAME) \
	containerImage=$(ACR_NAME).azurecr.io/msicheck:latest \
	containerPort=5000 \
	acrName=$(ACR_NAME) \
	storageAccountName=$(STORAGE_ACCOUNT_NAME) \
	roleDefinitionName=$(STORAGE_ACCOUNT_CONTRIBUTOR_ROLE) \
	env=@web/env.json

実行コード側

こちらは普通のMSIのコード。azure go sdk のazure-sdk-for-go/sdk/azidentity(https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/[email protected]) を使っているDefaultAzureCredentialを使うとデフォルト設定で、フォールバックしながら、認証元を探してく、その中にMSIが入っている。

DefaultAzureCredential

なかなか便利(だと思う)なのだが、バージョン安定性が低い。今回は、azcore 0.23.0に、azblob が付いてこれてないらしく。(このあたりに事情がかいてある)
とりあえず前のバージョンを使うことにした。[4]

最後に

Azure Container Apps なかなか良さげでお勧めです。もちろん、bicepも。

脚注
  1. Azure Container Apps を略してACAと呼ぶそうです。 ↩︎

  2. https://kogelog.com/2022/04/14/20220414-01/
    Public preview: Managed identities support in Azure Container Apps https://azure.microsoft.com/ja-jp/updates/public-preview-managed-identities-support-in-azure-container-apps/ ↩︎

  3. アプリは、k8sでいうPODのような位置付けになり、新しいAPIやサービスを作ると増減することを想定している。場合によっては3桁になる場合もあるだろう。 ↩︎

  4. これ、Migrate azblob to latest version of azcore #17528が来たら直るんじゃないかと思っている。 ↩︎