すべてのインスタンスが同じ IAM ロールを使用する場合、どの SageMaker ノートブックインスタンスが特定の API 呼び出しを行ったかを判断するにはどうすればよいですか?

最終更新日: 2021 年 3 月 17 日

複数の Amazon SageMaker ノートブックインスタンスがあります。それらはすべて同じ AWS Identity and Access Management (IAM) ロールを使用します。各 API アクションの AWS CloudTrail イベントには、アクションを実行したノートブックインスタンスに関係なく、同じ PrincipalID (セッション名) が表示されます。どのノートブックインスタンスがどの API アクションを実行したかを知るにはどうすればよいですか?

簡単な説明

同じ IAM ロールを持つ複数の SageMaker インスタンスがある場合、CloudTrail イベントで特定の API アクションを実行したノートブックインスタンスを特定することはできません。

例:

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AAAAAAAAAAAAAAAAAA:SageMaker",
       
    "arn": "arn:aws:sts::111122223333:assumed-role/AmazonSageMaker-ExecutionRole/SageMaker",

解決方法

1.    SageMaker ノートブックインスタンスの IAM 実行ロールを作成します。または、既存の実行ロールを使用します。以下の手順では、実行ロールの Amazon リソースネーム (ARN) は arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole です。

2.    sts: AssumeRole を含む IAM ポリシーを実行ロールにアタッチします。sts:AssumeRole アクションを使用すると、実行ロールは別のセッション名を使用して自分自身を引き受けることができます。例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole"
        }
    ]
}

3.    次のような ノートブック ライフサイクル設定の開始スクリプトを作成します。このサンプルスクリプトは、ノートブックインスタンス名を取得し、その名前をセッション名として使用します。

Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

#!/bin/bash
# Create a new bash script file using the cat command
# The new bash script will be used to set up the cron job at the end of this script
cat >/home/ec2-user/scriptAssumeRole.sh <<'EOF'
#!/bin/bash

set -e

# Obtain the name of the notebook instance
nbname=$(jq -r '.ResourceName' /opt/ml/metadata/resource-metadata.json)

# Use the AWS Command Line Interface (AWS CLI) to obtain the Amazon Resource Name (ARN) of the IAM execution role
nbinfo=$(aws sagemaker describe-notebook-instance --notebook-instance-name $nbname)
nbrole=$(jq -r '.RoleArn' <<< "$nbinfo")

# Use the AWS CLI to get the new credentials and create a session name based on the notebook instance name
cred=$(aws sts assume-role --role-arn $nbrole --role-session-name $nbname)

# Initialize variables
AccessKeyId=""
SecretAccessKey=""
SessionToken=""

# Obtain individual values from credentials
AccessKeyId=$(jq -r '.Credentials.AccessKeyId' <<< "$cred")
SecretAccessKey=$(jq -r '.Credentials.SecretAccessKey' <<< "$cred")
SessionToken=$(jq -r '.Credentials.SessionToken' <<< "$cred")

# Obtain the Region of the notebook instance
nbregion=$(aws configure get region)

# Obtain the length of each variable for conditional testing
len1=${#AccessKeyId}
len2=${#SecretAccessKey}
len3=${#SessionToken}

# Write credentials to a new config file
cat > /home/ec2-user/.aws/config.new <<EOF1
[default]
region=$nbregion
aws_access_key_id=$AccessKeyId
aws_secret_access_key=$SecretAccessKey
aws_session_token=$SessionToken
EOF1

if [[ ($len1 -gt 0) && ($len2 -gt 0) && ($len3 -gt 0) ]];
then
  # Overwrite the config with a new config file only if credentials are obtained
  echo "Credentials obtained."
sudo mv /home/ec2-user/.aws/config.new /home/ec2-user/.aws/config
else
  echo "No credentials are available."
fi
EOF
chmod +x /home/ec2-user/scriptAssumeRole.sh

# Now run the script:
echo "Running Assume Role Script"
/home/ec2-user/scriptAssumeRole.sh

echo "Setting up cron job every 15 minutes"
(crontab -l 2>/dev/null; echo "*/15 * * * * /home/ec2-user/scriptAssumeRole.sh") | crontab -

4.    SageMaker ノートブックインスタンスを作成して、前のステップで作成したライフサイクル設定スクリプトをアタッチします。この例では、ノートブックインスタンスの名前は test-2 となります。

5.    API アクションを実行したノートブックインスタンスを特定するには、CloudTrail イベントを確認します。userIdentity オブジェクトの下、principalIdarn にノートブックインスタンス名が表示されます。例えば、次のイベントの詳細は、test-2 という名前の SageMaker ノートブックインスタンスが API 呼び出しを行ったことを示しています。

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AAAAAAAAAAAAAAAAAAAA:test-2",
        "arn": "arn:aws:sts::111122223333:assumed-role/AmazonSageMaker-ExecutionRole/test-2",
        "accountId": "111122223333",
        "accessKeyId": "AAAAAAAAAAAAAAAAAAAA",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AAAAAAAAAAAAAAAAAAAA",
                "arn": "arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole",
                "accountId": "111122223333",
                "userName": "AmazonSageMaker-ExecutionRole"
            },
            "webIdFederationData": {},
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2020-09-12T00:45:04Z"
            }
        },
        "invokedBy": "im.amazonaws.com"
    },
    "eventTime": "2020-09-12T00:49:04Z",
    "eventSource": "sagemaker.amazonaws.com",
    "eventName": "CreateEndpoint",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "im.amazonaws.com",
    "userAgent": "im.amazonaws.com",
    "requestParameters": {
        "endpointName": "sagemaker-mxnet-ep",
        "endpointConfigName": "sagemaker-mxnet-epc",
        "tags": []
    },
    "responseElements": {
        "endpointArn": "arn:aws:sagemaker:us-east-1:111122223333:endpoint/sagemaker-mxnet-ep"
    },
    "requestID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "eventID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333"
}

この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?