You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:57:13