次の方法で共有


チュートリアル: Azure Container Apps を使用してセッション プールでシェル コマンドを実行する (プレビュー)

このチュートリアルでは、Azure Container Apps にシェル セッション プールをデプロイし、動的セッション API と ARM テンプレートを使用してシェル コマンドを実行する方法について説明します。

このチュートリアルでは、次のことを行います。

  • ARM テンプレートを使用してシェル セッション プールをデプロイする
  • 適切なアクセス許可を持つユーザー割り当てマネージド ID を作成する
  • 動的セッション API を使用してシェル コマンドを実行する

[前提条件]

このチュートリアルを開始する前に、次のリソースが必要です。

Requirement Description
Azure アカウント アクティブなサブスクリプションを含む Azure アカウントが必要です。 持っていない場合は、無料で作成できます。
Azure CLI Azure CLI のインストールを実行します。

設定

まず、最新の更新プログラムを使用して Azure CLI を準備し、Azure にサインインします。

  1. Azure CLI を最新バージョンに更新します。

    az upgrade
    
  2. Microsoft.App リソースプロバイダーを登録します。

    az provider register --namespace Microsoft.App
    
  3. 最新バージョンの Azure Container Apps CLI 拡張機能をインストールします。

    az extension add --name containerapp --allow-preview true --upgrade
    
  4. Azure にサインインします。

    az login
    
  5. Azure サブスクリプション ID に対してクエリを実行し、値を変数に設定します。

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    
  6. このプロシージャで使用する変数を設定します。

    次のコマンドを実行する前に、<> で囲まれたプレースホルダーを実際の値に置き換えてください。

    RESOURCE_GROUP=<RESOURCE_GROUP_NAME>
    SESSION_POOL_NAME=<SESSION_POOL_NAME>
    LOCATION=<LOCATION>
    API_VERSION="2025-10-02-preview"
    

    これらの変数を使用して、次の手順でリソースを作成します。

  7. リソース グループの作成に使用するサブスクリプションを設定します。

    az account set -s $SUBSCRIPTION_ID
    
  8. リソース グループを作成する。

    az group create --name $RESOURCE_GROUP --location $LOCATION
    

ARM テンプレートを作成する

シェル セッション プールを定義するために、 deploy.json という名前の ARM テンプレート ファイルを作成します。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
      {
         "apiVersion": "2025-10-02-preview",
            "name": "myshellpool",
            "type": "Microsoft.App/sessionpools",
            "location": "North Central US",
            "properties": {
                "poolManagementType": "Dynamic",
                "containerType": "Shell", # Set the "containerType" property to "Shell"
                "scaleConfiguration": {
                    "maxConcurrentSessions": 5
                },
                "dynamicPoolConfiguration": {
                    "lifecycleConfiguration": {
                        "lifecycleType": "Timed",
                        "cooldownPeriodInSeconds": 300
                    }
                },
                "sessionNetworkConfiguration": {
                    "status": "EgressEnabled"
                }
            }
        }
    ]
}

シェル セッション プールをデプロイする

ARM テンプレートを使用して、シェル セッション プールをデプロイします。

az deployment group create --resource-group $RESOURCE_GROUP --template-file deploy.json

マネージド ID を割り当てる

セッション プールへの API 呼び出しの認証に使用されるユーザー割り当てマネージド ID を作成します。

  1. ID 名とプール リソース ID を設定します。

    UAMI_NAME=${SESSION_POOL_NAME}-uami
    POOL_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.App/sessionpools/$SESSION_POOL_NAME"
    
  2. ユーザー割り当てマネージド ID を作成します。

    az identity create --resource-group $RESOURCE_GROUP --name $UAMI_NAME --location $LOCATION
    
  3. マネージド ID のプリンシパル ID を取得します。

    UAMI_PRINCIPAL=$(az identity show --resource-group $RESOURCE_GROUP --name $UAMI_NAME --query principalId -o tsv)
    

マネージド ID を Azure Container App に割り当てる

Azure Container App を作成または更新するときは、ユーザー割り当てマネージド ID をアプリに割り当てます。 例えば次が挙げられます。

az containerapp update \
  --name <CONTAINER_APP_NAME> \
  --resource-group $RESOURCE_GROUP \
  --user-assigned $UAMI_NAME

詳細については、「 コンテナー アプリにマネージド ID を割り当てる 」を参照してください。

セッション実行 API のロールの割り当てを設定する

セッション プールの API を操作するには、マネージド ID に Azure ContainerApps Session Executor ロールを割り当てる必要があります。

ID の伝達を待ってから、マネージド ID にロールを割り当てます。

az role assignment create --assignee $UAMI_PRINCIPAL --role "Azure ContainerApps Session Executor" --scope $POOL_ID

ベアラー トークンを取得する

セッション プールの API にアクセスするには、アクセス トークンが必要です。 メソッドは、コードを実行している場所によって異なります。

Azure Container App 内から

ユーザー割り当てマネージド ID が割り当てられている Azure Container App 内から実行する場合は、Azure Instance Metadata Service (IMDS) を使用してアクセス トークンを取得します。

ACCESS_TOKEN=$(curl -s -H "Metadata: true" \
  "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://dynamicsessions.io" \
  | jq -r '.access_token')

このコマンドは、トークンを取得し、access_tokenを使用して JSON 応答からjq値を抽出します。

ローカル テストと開発用

ローカルまたは開発環境からテストする場合は、Azure CLI を使用してアクセス トークンを取得できます (適切なアクセス許可が必要です)。

ACCESS_TOKEN=$(az account get-access-token --resource "https://dynamicsessions.io" --query accessToken --output tsv)

ローカル テストを機能させるには、セッション プールに "Azure ContainerApps Session Executor" ロールが割り当てられているユーザーまたはサービス プリンシパルとして Azure CLI セッションを認証する必要があります。 運用環境のシナリオでは、マネージド ID アプローチをお勧めします。

セッションでシェル コマンドを実行する

セキュリティ コンテキストを確立するためのベアラー トークンが用意されたので、セッション プールに要求を送信してシェル コマンドを実行できます。

  1. API 呼び出しの要求本文を作成します。

    EXEC_ID=$(uuidgen)
    BODY=$(cat <<EOF
     {
       "codeInputType": "inline",
       "executionType": "synchronous",
       "shellCommand": "echo Hello world!",
       "timeoutInSeconds": 600
     }
     EOF
     )
    
  2. API エンドポイント URL を構築します。

    URL="https://$LOCATION.dynamicsessions.io/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/sessionPools/$SESSION_POOL_NAME/executions?api-version=$API_VERSION&identifier=$EXEC_ID"
    
  3. シェル コマンドを実行します。

    Azure Container App またはローカル テスト内から:

    curl --request POST --url "$URL" --header "Authorization: Bearer $ACCESS_TOKEN" --header 'content-type: application/json' --data "$BODY"
    

    シェル コマンド (hello world および hi) からの出力を含む、実行結果を含む JSON 応答を受け取る必要があります。

デプロイメントを検証する

次のコマンドを使用して、リソースが正常に作成されたことを確認できます。

  1. セッション プールが展開されているか確認します。

    az resource show --ids "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.App/sessionpools/$SESSION_POOL_NAME" --query '{name:name, location:location, provisioningState:properties.provisioningState}'
    
  2. ロールの割り当てを確認します。

    az role assignment list --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.App/sessionpools/$SESSION_POOL_NAME" --output table
    

リソースをクリーンアップする

このチュートリアルで作成したリソースは、Azure の請求書に影響します。 これらのサービスを長期間使用しない場合は、次のコマンドを実行して、このチュートリアルで作成したすべてのものを削除してください。

az group delete --resource-group $RESOURCE_GROUP

次のステップ