Comment déterminer quelle instance de bloc-notes SageMaker a effectué un appel API particulier si toutes les instances utilisent le même rôle IAM ?

Dernière mise à jour : 17/03/2021

J'ai plusieurs instances de bloc-notes Amazon SageMaker. Elles utilisent toutes le même rôle AWS Identity and Access Management (IAM). L'événement AWS CloudTrail pour chaque action API affiche le même PrincipalID (nom de session), quelle que soit l'instance de bloc-notes qui a effectué l'action. Comment savoir quelle instance de bloc-notes a effectué quelles actions d'API ?

Brève description

Lorsque vous avez plusieurs instances SageMaker avec le même rôle IAM, vous ne pouvez pas déterminer quelle instance de bloc-notes a effectué une action API particulière avec l'événement CloudTrail.

Exemple :

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

Solution

1.    Créez un rôle d'exécution IAM pour l'instance de bloc-notes SageMaker. Ou utilisez un rôle d'exécution existant. Dans les étapes suivantes, Amazon Resource Name (ARN) pour le rôle d'exécution est arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole.

2.    Attachez une stratégie IAM qui inclut sts:AssumeRole au rôle d'exécution. L'action sts:AssumeRole permet au rôle d'exécution de s'assumer en utilisant un nom de session différent. Exemple :

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

3.    Créez un script de configuration du cycle de vie du bloc-notes Start similaire à ce qui suit. Ce script d'exemple récupère le nom de l'instance du bloc-notes et utilise ensuite ce nom comme nom de session.

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.    Créez une instance de bloc-notes SageMaker et attachez le script de configuration du cycle de vie que vous avez créé à l'étape précédente. Pour cet exemple, supposez que l'instance de bloc-notes est nommée test-2.

5.    Pour identifier l'instance de bloc-notes qui a effectué une action API, vérifiez l'événement CloudTrail. Sous l'objet userIdentity, le principalId et l'arn indiquent le nom de l'instance du bloc-notes. Par exemple, le détail de l'événement suivant montre que l'instance de bloc-notes SageMaker nommée test-2 a effectué l'appel 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"
}

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?