如何在AWS Glue作业中获取触发任务的IAM用户名?
获取AWS Glue作业触发者的IAM用户名
当你在Glue作业中调用sts.get_caller_identity()时,返回的是Glue服务角色的临时会话信息(比如AROA6CNCYWLF5MGCB5DF4:GlueJobRunnerSession),而非触发作业的IAM用户名。这是因为Glue作业通过**假设角色(Assumed Role)**运行,作业的执行上下文使用的是Glue服务角色的凭证,和触发用户的身份是分离的。
以下是几种可行的解决方案:
1. 手动触发时通过作业参数传递用户名
如果是在AWS控制台手动启动Glue作业,可以在触发时添加自定义作业参数,将当前IAM用户名传入作业:
- 触发作业时,在作业参数中添加键值对:
--triggering_user= 你的IAM用户名 - 在Glue作业代码中读取该参数:
import sys from awsglue.utils import getResolvedOptions # 解析作业参数 args = getResolvedOptions(sys.argv, ['triggering_user']) print('触发作业的IAM用户名:', args['triggering_user'])
2. 自动化触发时传递用户信息
如果通过CloudWatch Events、Step Functions等自动化工具触发作业,需要在触发流程中显式传递触发用户的信息:
- 例如在Step Functions的Glue任务定义中,通过
Parameters字段添加作业参数:"StartGlueJob": { "Type": "Task", "Resource": "arn:aws:states:::glue:startJobRun.sync", "Parameters": { "JobName": "your-glue-job-name", "Arguments": { "--triggering_user.$": "$.triggeringUserName" } } } - 确保触发流程中可以获取到用户身份信息,并传递给Glue作业。
3. 通过CloudTrail日志回溯触发用户
如果无法在触发时传递参数,可以通过CloudTrail日志查询作业启动事件,从中提取触发用户的信息:
- 给Glue作业的执行角色添加
cloudtrail:LookupEvents权限 - 在Glue作业代码中调用CloudTrail API查询对应作业Run ID的启动事件:
import boto3 from awsglue.utils import getResolvedOptions import sys # 获取当前作业的Run ID args = getResolvedOptions(sys.argv, ['JOB_RUN_ID']) job_run_id = args['JOB_RUN_ID'] # 初始化CloudTrail客户端 cloudtrail_client = boto3.client('cloudtrail') # 查询作业启动事件 response = cloudtrail_client.lookup_events( LookupAttributes=[ { 'AttributeKey': 'ResourceName', 'AttributeValue': job_run_id } ], EventCategory='Management' ) # 提取触发用户信息 for event in response['Events']: if event['EventName'] == 'StartJobRun': user_identity = event['UserIdentity'] print(f"触发用户ID: {user_identity['UserId']}") print(f"触发用户名: {user_identity.get('UserName', '未获取到用户名')}") break
注意:CloudTrail日志存在一定延迟,可能无法实时获取触发信息,且需要确保目标区域已启用CloudTrail日志记录。
内容的提问来源于stack exchange,提问作者Sridhar
相关产品推荐
相关产品推荐

