クロスアカウントでAmazon SageMaker Experimentsを利用する
小ネタです。アカウントA(アカウントID:111111111111)にあるSageMaker Experimentsに対して、アカウントB(アカウントID:222222222222)のCloud 9からアクセスする方法です。需要あるかわかりませんがやってみたのでまとめます。
アカウントAでSageMaker Studioを立てる
SageMaker Experimentsを利用するには、SageMaker Studioが必要です。SageMakerのマネジメントコンソールにいき、Amazon SageMaker StudioのリンクをクリックしSageMaker Domainをセットアップします。
作成した後、[実行ロール]に arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS
というIAMロールが作成されるのでメモしておきます。
アカウントBでAssume RoleができるIAMポリシーを作成する
アカウントBでマネジメントコンソールにログインし、IAMポリシーを作成します。IAMポリシーは以下になります。arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS
は先ほど作成された実行ロールに置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS"
]
}
]
}
アカウントBでIAMロールを作成するIAMロールを作成する
今回はCloud 9で実行するので、IAMロール作成画面の[ユースケースの選択]では[EC2]を選択します。そして先ほど作成したIAMポリシーをアタッチしIAMロールを作成します。このときのIAMロールのARN(例:arn:aws:iam::222222222222:role/cloud9
)をメモしておきます。
アカウントAのSageMaker実行ロールを編集する
アカウントAに戻り、SageMaker実行ロール(AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS
)の画面にいき、[信頼関係]タブを選択、[信頼関係の編集]をクリックして以下のように編集します。arn:aws:iam::222222222222:role/cloud9
は先ほど作成したアカウントBのIAMロールに置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:role/cloud9", # 追加
"Service": "sagemaker.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
以上で、クロスアカウントでアクセスできる準備は整いました。
アカウントBのCloud 9からクロスアカウントする
アカウントBからアカウントAのSageMaker Experimentsにアクセスします。アカウントBでCloud 9のコンソール画面にいき、[Create Environment]からインスタンスを立ち上げます。このとき、先ほど作成したIAMロール(arn:aws:iam::222222222222:role/cloud9
)を選択します。
Cloud9が起動したら以下のリンクを参考にEC2 IAMロールの権限で利用できるようにします。
Cloud9からIAM Roleの権限でAWS CLIを実行する | DevelopersIO
Cloud9のターミナル画面から以下のコマンドを実行してSageMakerおよびSageMaker Experimentsのパッケージを入れます。
$ pip install -qU boto3 "sagemaker>=1.71.0,<2.0.0"
$ pip install sagemaker-experiments
$ pip install pandas
以下のスクリプトを適当なファイル(sagemaker.py
など)で保存します。arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS
は先ほど作成された実行ロールに置き換えてください。
from time import strftime, gmtime
import boto3
import sagemaker
from smexperiments.experiment import Experiment
sts_connection = boto3.client('sts')
assume_role = sts_connection.assume_role(
RoleArn="arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS",
RoleSessionName="cross_acct"
)
boto_session = boto3.Session(
region_name="ap-northeast-1",
aws_access_key_id=assume_role['Credentials']['AccessKeyId'],
aws_secret_access_key=assume_role['Credentials']['SecretAccessKey'],
aws_session_token=assume_role['Credentials']['SessionToken'],
)
create_date = strftime("%Y-%m-%d-%H-%M-%S", gmtime())
experiment_evaluate = Experiment.create(
experiment_name="assume-role-experiment-evaluate-{}".format(create_date),
description="Example experiment_evaluate",
sagemaker_boto_client=boto_session.client('sagemaker'),
)
print(experiment_evaluate)
このスクリプトを実行した後、アカウントAのSageMaker Studioにいき、SageMaker Experimentsが作成できればOKです。
Discussion