ある AWS アカウントで Amazon SageMaker モデルをトレーニングしています。このモデルを別の AWS アカウントのエンドポイントにデプロイしたいと考えています。
解決策
アカウント A (サンドボックスアカウント)
- AWS Key Management Service (AWS KMS) キーを作成します。[キーの使用アクセス許可の定義] ページの [別の AWS アカウント] セクションで、[別の AWS アカウントを追加する] を選択します。次に、アカウント B (モデルをデプロイするアカウント) の AWS アカウント番号を入力します。このキーは、Amazon SageMaker のトレーニングジョブに使用します。AWS KMS キーを指定しない場合、Amazon SageMaker はデフォルトで Amazon Simple Storage Service (Amazon S3) のサーバー側の暗号化キーを使用します。デフォルトの Amazon S3 サーバー側暗号化キーを別の AWS アカウントと共有したり、使用したりすることはできません。
- トレーニングジョブを作成します (作成していない場合)。Estimator クラスに、前のステップで作成した AWS KMS キーを追加します。次の例を参照してください:
linear = sagemaker.estimator.Estimator(
...
output_kms_key='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
...
)
アカウント B (デプロイアカウント)
-
次のような AWS Identity and Access Management (IAM) ポリシーを 2 つ作成します。これらはインラインポリシーであるため、IAM ID (ユーザー、グループ、またはロール) に埋め込まれます。
**インラインポリシー 1:**これは、モデルアーティファクトを含むアカウント A の Amazon S3 リソースへのアクセスを IAM ロールに許可します。awsdoc-example-bucket を、トレーニングジョブの出力が保存されている S3 バケットの名前に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::awsdoc-example-bucket/sagemaker/linear-learner/output/model.tar.gz"
}
]
}
**インラインポリシー 2:**これは、今後の IAM ロールに、アカウント A の KMS キーの使用を許可します。リソース で、アカウント A のアカウント ID とキー ID を指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUseOfTheKey",
"Effect": "Allow",
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": [
"arn:aws:kms:us-east-1:AccountA:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
]
}
]
}
-
Amazon SageMaker 用の IAM ロールを作成します。このロールには AmazonSageMakerFullAccess ポリシーがあります。
-
ステップ 1 で作成した 2 つのインラインポリシーを、ステップ 2 で作成したロールにアタッチします。ロールには以下の 3 つのポリシーがあります。 AmazonSageMakerFullAccess と 2 つのインラインポリシーがあります。
アカウント A (サンドボックスアカウント)
トレーニングジョブの出力が保存されるバケットの S3 バケットポリシーを作成します。このバケットポリシーは、前のセクションで作成したロールがモデルアーティファクトにアクセスすることを許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AccountB:root"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::awsdoc-example-bucket/sagemaker/linear-learner/output/model.tar.gz",
"Condition": {
"StringEquals": {
"aws:PrincipalArn": "arn:aws:iam::AccountB:role/AmazonSageMaker"
}
}
}
]
}
**注:**この例では、AccountB をデプロイアカウントの AWS アカウント ID に置き換えてください。AmazonSageMaker を、デプロイアカウントで作成したロールの名前に置き換えます。awsdoc-example-bucket を、トレーニングジョブの出力が保存される S3 バケットに置き換えます。
デプロイモデルを作成する
- Amazon SageMaker コンソールを開きます。
- ナビゲーションペインの [推論] で、[モデル] を選択します。
- [モデルを作成] を選択し、モデルの名前を入力します。
- [IAM ロール] で、[カスタム IAM ロール ARN を入力] を選択します。その後、次のようにカスタム ARN を完成させます。
[YourAcountID] で、アカウント B の ID を入力します。
[YourRole] で、アカウント B で作成した IAM ロールの名前を入力します。
- [推論コード画像の場所] で、推論コード画像が保存されているレジストリパスを指定します。推論イメージは、Amazon Elastic Container Registry (Amazon ECR) またはプライベート Docker レジストリに保存されます。
- [モデルアーティファクトの場所] で、Amazon S3 でモデルアーティファクトが保存される URL を指定します。
- ページの下部で [モデルの作成] を選択します。モデルの作成の詳細については、「パイプラインモデルを作成する」を参照してください。
エンドポイント設定を作成する
- Amazon SageMaker コンソールを開きます。
- ナビゲーションペインの [推論] で、[エンドポイント設定] を選択します。
- [エンドポイント設定を作成] を選択します。次に、[本番稼働用バリアント] で、前のセクションで作成したモデルを追加します。
- [エンドポイント設定を作成] を選択します。
エンドポイントを作成する
- Amazon SageMaker コンソールを開きます。
- ナビゲーションペインの [推論] で、[エンドポイント] を選択します。
- [エンドポイントの作成] を選択し、前のセクションで作成したエンドポイント設定を選択します。
- [エンドポイントの作成] を選択します。
これで、アカウント A からアカウント B にモデルをデプロイする準備ができました。
**注:**Amazon SageMaker モデルの暗号化を再トレーニングしたくない場合は、後処理ステップとしてオブジェクトを暗号化できます。既存のオブジェクトを暗号化するには、カスタマー管理キーを使用して SSE-KMS で暗号化したオブジェクトを、オブジェクト自体にコピーします。