[英]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-name
的session-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.