如何在Lambda事件中获取访问API的IAM用户名?
获取API Gateway访问者的IAM身份信息
要识别访问API端点的IAM用户(获取用户名/邮箱),核心是启用API Gateway的IAM授权,并在Lambda中提取身份信息后通过AWS服务获取用户详情。以下是具体实现步骤:
1. 配置API Gateway的IAM授权
在API Gateway控制台找到你的端点对应方法(如GET),将授权类型设置为AWS_IAM。这会强制所有请求必须携带有效的IAM签名,同时API Gateway会把调用者的身份信息传递给Lambda。
2. 修改Lambda函数提取并获取用户信息
Lambda的event参数中,requestContext.identity字段包含调用者的基础身份数据(如ARN、userId)。你可以通过AWS SDK调用IAM服务,获取用户的邮箱等详细信息。
修改后的Lambda代码示例:
import json import logging import boto3 logger = logging.getLogger() logger.setLevel(logging.INFO) iam_client = boto3.client('iam') def respond(err, res=None): return { 'statusCode': '400' if err else '200', 'body': str(err) if err else json.dumps(res), 'headers': { 'Content-Type': 'application/json', }, } def lambda_handler(event, context): logger.info('Received event: %s' + json.dumps(event, indent=2)) try: # 从event中提取调用者的IAM身份ARN caller_arn = event['requestContext']['identity']['userArn'] # 从ARN中拆分出用户名(ARN格式:arn:aws:iam::账号ID:user/用户名) username = caller_arn.split('/')[-1] # 调用IAM API获取用户详情 user_info = iam_client.get_user(UserName=username)['User'] # 从用户标签中提取邮箱(需提前在IAM控制台给用户添加email标签) user_email = next((tag['Value'] for tag in user_info.get('Tags', []) if tag['Key'] == 'email'), None) # 若用户名本身是邮箱格式,也可直接使用 # user_email = username if '@' in username else None param1 = event['queryStringParameters']['name'] param2 = event['queryStringParameters']['age'] res_data = { 'message': 'Hello World!', 'caller_username': username, 'caller_email': user_email, 'received_params': {'name': param1, 'age': param2} } return respond(None, res=res_data) except Exception as e: logger.error(f"处理请求出错: {str(e)}") return respond(e)
3. 配置Lambda执行角色权限
确保Lambda的执行角色拥有iam:GetUser权限,否则无法调用IAM API获取用户信息。给该角色添加如下权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:GetUser", "Resource": "arn:aws:iam::你的账号ID:user/*" } ] }
注意事项
- 若调用者使用IAM角色临时凭证访问(如EC2实例角色、SSO角色),
userArn会是角色ARN,此时需调用sts:GetCallerIdentity接口获取实际调用者身份后再处理。 - 用户邮箱需提前在IAM控制台配置(通过标签或设置用户名为邮箱格式),否则无法直接获取。
- 测试时,需使用带AWS签名的请求工具(如Postman的AWS签名认证、AWS CLI),确保请求携带有效IAM凭证。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

