本地Python代码触发AWS Lambda失败(ExpiredTokenException)及STS角色方案咨询
问题分析
错误ExpiredTokenException说明当前请求使用的AWS凭证已过期,你的代码默认调用本地配置的长期凭证(如~/.aws/credentials或环境变量),这类凭证失效导致调用失败。
现有配置的缺失点:
- 代码未实现STS角色扮演逻辑,未利用具备权限的角色临时凭证发起Lambda调用
- 权限策略中虽包含
sts:AssumeRole权限,但代码未基于该权限获取有效临时凭证
基于STS角色的解决方案
1. 确认角色配置正确性
权限策略(附加到被扮演的角色,例如LambdaInvokerRole)
确保该角色拥有调用目标Lambda的权限,策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "<你的Lambda函数ARN>" } ] }
信任策略(被扮演角色的信任关系)
允许执行代码的实体(如你的IAM用户)扮演该角色,策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "<你的IAM用户ARN>" }, "Action": "sts:AssumeRole" } ] }
同时需确保执行代码的IAM用户拥有sts:AssumeRole权限,允许其扮演上述LambdaInvokerRole。
2. 修改Python代码实现STS角色扮演
通过STS获取临时凭证后,用该凭证创建Lambda客户端,避免依赖过期的长期凭证:
import boto3 from botocore.exceptions import ClientError def get_sts_temp_credentials(role_arn, role_session_name): sts_client = boto3.client('sts') try: response = sts_client.assume_role( RoleArn=role_arn, RoleSessionName=role_session_name ) return response['Credentials'] except ClientError as e: print(f"获取临时凭证失败: {e}") return None def invoke_lambda_with_temp_creds(temp_creds): if not temp_creds: return lambda_client = boto3.client( 'lambda', aws_access_key_id=temp_creds['AccessKeyId'], aws_secret_access_key=temp_creds['SecretAccessKey'], aws_session_token=temp_creds['SessionToken'] ) try: response = lambda_client.invoke( FunctionName='MyLambdaFunctionName', InvocationType='RequestResponse', Payload=b'{}' ) print(f"Lambda响应: {response}") # 可选:解析响应Payload import json payload = json.loads(response['Payload'].read()) print(f"响应内容: {payload}") except Exception as e: print(f"调用Lambda失败: {e}") # 替换为你的角色ARN和自定义会话名称 TARGET_ROLE_ARN = "<你的LambdaInvokerRole ARN>" SESSION_NAME = "LambdaInvocationSession" temp_creds = get_sts_temp_credentials(TARGET_ROLE_ARN, SESSION_NAME) invoke_lambda_with_temp_creds(temp_creds)
3. 关键说明
- 临时凭证由STS自动生成,有效期最长12小时,无需手动管理长期AccessKey/SecretKey
- 执行代码的环境(如本地机器、EC2实例)需能通过AWS默认凭证链(如IAM角色、AWS CLI配置)访问STS服务,无需手动输入凭证
内容的提问来源于stack exchange,提问作者Humble_PrOgRaMeR
相关产品推荐
相关产品推荐

