繁体   English   中英

为什么在尝试连接到 AWS Glue 时将 session 名称附加到角色名称?

[英]why is the session name appended to the role name when trying to connect to AWS Glue?

我正在尝试使用 boto3 使用 Amazon Glue 创建作业。 我使用 STS 连接到 AWS 账户,代码如下:

session_name = 'glue_job_creation'
client = boto3.client("sts",region_name="eu-west-1",endpoint_url="https://sts.eu-west-1.amazonaws.com")
response = client.assume_role(RoleArn=arn , RoleSessionName=session_name)
temp_credentials = response["Credentials"]

glue = boto3.client(service_name='glue', region_name='eu-west-1',
                endpoint_url='https://glue.eu-west-1.amazonaws.com',
                aws_access_key_id=temp_credentials["AccessKeyId"],
                aws_secret_access_key=temp_credentials["SecretAccessKey"],
                aws_session_token=temp_credentials["SessionToken"])

def list_glue_jobs():
    response = glue.list_jobs()
    print(response)

def create_glue_job():
    print('creating new glue job...')
    print(response)
    myJob = glue.create_job(Name='sample', Role=JobRole,
                            Command={'Name': 'glueetl',
                                    'ScriptLocation': script_location})

    myNewJobRun = glue.start_job_run(JobName=myJob['Name'])
    return myNewJobRun

list_job function 工作正常,但create_job不起作用。 我收到以下错误:

botocore.errorfactory.AccessDeniedException: An error occurred (AccessDeniedException) when calling the CreateJob operation: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/assumed-role-name/session-name is not authorized to perform: iam:PassRole on resource: arn:aws:iam::xxxxxxxxx:role/assumed-role because no identity-based policy allows the iam:PassRole action

我不明白为什么在这种情况下session-name会附加到用户 ARN。 此外,解决这个问题的方法是简单地创建一个 IAM 角色,并将 session 名称附加到角色名称后,如assumed-role/role-name ,还是我遗漏了什么?

Session 名称只是一个任意字符串,用于识别某人/某物何时使用 IAM 角色。 由于 IAM 角色没有像 IAM 用户那样的凭证,因此使用 IAM 角色的唯一方法是代它们。 例如,EC2 机器承担附加到它们的 IAM 角色并将其实例 ID 用作 session 名称,因此在 CloudTrail 日志中您可以看到哪个实例正在使用该 IAM 角色,即使多个实例承担相同的 IAM 角色。

所以当你看到这样的东西时:
arn:aws:sts::xxxxxxxxxxxx:assumed-role/assumed-role-name/session-name
它只是意味着:

我是session-name ,我正在使用 IAM 角色arn:aws:iam::xxxxxxxxxxxx:role/assumed-role-name

请注意,实际 IAM 角色在 ARN 中具有aws:iam ,而代入角色在 ARN 中具有aws:sts 名称为 session 的代入角色 ARN 是临时 session,而不是您可以创建/更新的现有 IAM 资源/文档。 有关承担 IAM 角色的更多详细信息,请参阅STS AssumeRole API 参考

因此,在您的示例中,使用 IAM 角色assumed-role-namesession-name名称希望使用arn:aws:iam::xxxxxxxxx:role/assumed-role调用iam:PassRole

解决方案是使用以下策略声明扩展您的arn:aws:iam::xxxxxxxxxxxx:role/assumed-role-name角色:

{
    "Action": [
        "iam:PassRole"
    ],
    "Effect": "Allow",
    "Resource": "arn:aws:iam::xxxxxxxxxxxx:role/assumed-role",
    "Condition": {
        "StringLike": {
            "iam:PassedToService": [
                "glue.amazonaws.com"
            ]
        }
    }
}

这将允许assumed-role-name IAM 角色的用户将假定assumed-role IAM 角色传递给创建的 Glue 作业,因此新的 Glue 作业可以作为assumed-role运行并使用该 IAM 角色中指定的权限。

如果有兴趣,您可以在“授予权限以将角色传递给服务”AWS IAM 文档中阅读有关iam:PassRole的更多信息。 AWS Glue 文档“向访问 AWS Glue 的 IAM 用户附加策略”提供了有关 AWS Glue 为何需要此功能的更多信息(请注意有关 PassRole 要求的重要部分)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM