リアルタイム推論コンテナにプライベート Docker レジストリを使用する - Amazon SageMaker AI

リアルタイム推論コンテナにプライベート Docker レジストリを使用する

Amazon SageMaker AI ホスティングでは、Amazon ECR に保存されているイメージを使用して、デフォルトでリアルタイム推論のためのコンテナを構築できます。オプションで、プライベート Docker レジストリ内のイメージからリアルタイム推論用のコンテナを構築できます。プライベートレジストリは、アカウント内の Amazon VPC からアクセスできることが必要です。プライベート Docker レジストリに格納されているイメージに基づいて作成するモデルは、プライベート Docker レジストリがアクセスできる同じ VPC に接続するように設定する必要があります。モデルの VPC への接続の詳細については、「Amazon VPC のリソースへのアクセス権を SageMaker AI のホストされたエンドポイントに付与する」を参照してください。

Docker レジストリは、既知の公開認証機関 (CA) からの TLS 証明書で保護されている必要があります。

注記

SageMaker AI ホスティングがレジストリからモデルイメージをプルできるように、プライベート Docker レジストリは、モデルの VPC 設定で指定したセキュリティグループからのインバウンドトラフィックを許可する必要があります。

SageMaker AI は、VPC 内にオープンインターネットへのパスがある場合、DockerHub からモデルイメージをプルできます。

Amazon Elastic コンテナレジストリ以外のプライベート Docker レジストリにイメージを保存する

プライベートの Docker レジストリを使用して SageMaker AI リアルタイム推論用にイメージを保存するには、Amazon VPC からアクセスできるプライベートレジストリを作成します。Docker レジストリの作成の詳細については、Docker ドキュメントの「レジストリサーバーをデプロイする」を参照してください。Docker レジストリは、以下を満たす必要があります。

  • レジストリは Docker Registry HTTP API V2 レジストリであることが必要です。

  • Docker レジストリは、モデルの作成時に指定する VpcConfig パラメータで指定する同じ VPC からアクセスできる必要があります。

リアルタイム推論にプライベート Docker レジストリのイメージを使用する

モデルを作成し、SageMaker AI ホスティングにデプロイする場合に、プライベート Docker レジストリのイメージを使用して推論コンテナを構築するように指定できます。create_model 関数の呼び出しに渡す PrimaryContainer パラメータの ImageConfig オブジェクトでこれを指定します。

プライベート Docker レジストリに保存されているイメージを推論コンテナに使用するには
  1. イメージ設定オブジェクトを作成し、RepositoryAccessMode フィールドに Vpc の値を指定します。

    image_config = { 'RepositoryAccessMode': 'Vpc' }
  2. プライベートの Docker レジストリに認証が必要な場合は、RepositoryAuthConfig オブジェクトを、イメージ設定オブジェクトに追加します。RepositoryAuthConfig オブジェクトの RepositoryCredentialsProviderArn フィールドに、SageMaker AI がプライベートの Docker レジストリへの認証を許可する認証情報を提供する AWS Lambda 関数の Amazon リソースネーム (ARN) を指定します。認証を提供するために Lambda 関数を作成する方法については、「SageMaker AI がプライベート Docker レジストリに対して認証できるようにする」を参照してください。

    image_config = { 'RepositoryAccessMode': 'Vpc', 'RepositoryAuthConfig': { 'RepositoryCredentialsProviderArn': 'arn:aws:lambda:Region:Acct:function:FunctionName' } }
  3. 前のステップで作成したイメージ設定オブジェクトを使用し、create_model に渡すプライマリコンテナオブジェクトを作成します。

    ダイジェストフォームでイメージを提供します。:latest タグを使用してイメージを提供する場合、SageMaker AI が意図したよりも新しいバージョンのイメージをプルするリスクがあります。ダイジェストフォームを使用すると、意図したイメージバージョンを確実に SageMaker AI がプルするようになります。

    primary_container = { 'ContainerHostname': 'ModelContainer', 'Image': 'myteam.myorg.com/docker-local/my-inference-image:<IMAGE-TAG>', 'ImageConfig': image_config }
  4. create_model に渡すモデル名と実行ロールを指定します。

    model_name = 'vpc-model' execution_role_arn = 'arn:aws:iam::123456789012:role/SageMakerExecutionRole'
  5. 1 つ以上のセキュリティグループとサブネットをモデルの VPC 設定に指定します。プライベート Docker レジストリは、指定したセキュリティグループからのインバウンドトラフィックを許可する必要があります。指定するサブネットは、プライベート Docker レジストリと同じ VPC 内にある必要があります。

    vpc_config = { 'SecurityGroupIds': ['sg-0123456789abcdef0'], 'Subnets': ['subnet-0123456789abcdef0','subnet-0123456789abcdef1'] }
  6. Boto3 SageMaker AI クライアントを入手します。

    import boto3 sm = boto3.client('sagemaker')
  7. PrimaryContainer および VpcConfig パラメータに前の手順で指定した値を使用して create_model を呼び出し、モデルを作成します。

    try: resp = sm.create_model( ModelName=model_name, PrimaryContainer=primary_container, ExecutionRoleArn=execution_role_arn, VpcConfig=vpc_config, ) except Exception as e: print(f'error calling CreateModel operation: {e}') else: print(resp)
  8. 最後に、前のステップで作成したモデルを使用し、create_endpoint_config および create_endpoint を呼び出してホスティングエンドポイントを作成します。

    endpoint_config_name = 'my-endpoint-config' sm.create_endpoint_config( EndpointConfigName=endpoint_config_name, ProductionVariants=[ { 'VariantName': 'MyVariant', 'ModelName': model_name, 'InitialInstanceCount': 1, 'InstanceType': 'ml.t2.medium' }, ], ) endpoint_name = 'my-endpoint' sm.create_endpoint( EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name, ) sm.describe_endpoint(EndpointName=endpoint_name)

SageMaker AI がプライベート Docker レジストリに対して認証できるようにする

認証が必要なプライベート Docker レジストリから推論イメージをプルするには、認証情報を提供する AWS Lambda 関数を作成し、create_model を呼び出すときに Lambda 関数の Amazon リソースネーム (ARN) を提供します。SageMaker AI が create_model を実行する場合、指定した Lambda 関数を呼び出して Docker レジストリに認証するための認証情報を取得します。

Lambda 関数を作成する

次の形式のレスポンスを返す AWS Lambda 関数を作成します。

def handler(event, context): response = { "Credentials": {"Username": "username", "Password": "password"} } return response

プライベート Docker レジストリの認証の設定方法に応じて、Lambda 関数が返す認証情報は、次のいずれかを意味する可能性があります。

  • 基本認証を使用するようにプライベート Docker レジストリを設定した場合、レジストリに対して認証するためのサインイン認証情報を提供します。

  • ベアラトークン認証を使用するようにプライベート Docker レジストリを設定すると、サインイン認証情報が認可サーバーに送信され、ベアラトークンが返され、これをプライベートの Docker レジストリへの認証に使用できます。

実行ロールに Lambda へのアクセス許可を付与する

create_model の呼び出しに使用する実行ロールには、AWS Lambda 関数を呼び出すためのアクセス許可が必要です。実行ロールのアクセス許可ポリシーに以下を追加します。

{ "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:*:*:function:*myLambdaFunction*" ] }

ここで、mylambdaFunction は Lambda 関数の名前です。ロールのアクセス許可ポリシーの編集の詳細については、AWS Identity and Access Management ユーザーガイドの「ロールのアクセス許可ポリシーの変更 (コンソール)」を参照してください。

注記

AmazonSageMakerFullAccess マネージドポリシーがアタッチされた実行ロールには、名前に SageMaker がある任意の Lambda 関数を呼び出せるアクセス許可があります。

Lambda のインターフェイス VPC エンドポイントを作成する

Amazon VPC がインターネット経由でトラフィックを送信せずに AWS Lambda 関数と通信できるようにインターフェイスエンドポイントを作成します。詳細については、AWS Lambda デベロッパーガイドの「Lambda のインターフェイス VPC エンドポイントの設定」を参照してください。

SageMaker AI ホスティングは VPC 経由で lambda.region.amazonaws.com にリクエストを送信し、Lambda 関数を呼び出します。インターフェイスエンドポイントの作成時にプライベート DNS 名を選択すると、Amazon Route 53 は呼び出しを Lambda インターフェイスエンドポイントにルーティングします。別の DNS プロバイダーを使用する場合は、必ず lambda.region.amazonaws.com を Lambda インターフェイスエンドポイントに対応付けてください。