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

如何配置IAM角色与策略,让API Gateway触发Lambda时代入Cognito认证用户角色

结论

Lambda函数的执行角色是和函数本身绑定的固定身份,触发时无法直接动态替换为Cognito认证用户的代入角色,所以无法直接实现Lambda运行时默认凭证自动为用户假设角色后的凭证。但可以通过以下两种方案省去手动编写AssumeRole代码的需求:


方案1:IAM细粒度权限替代角色假设(推荐,无额外代码)

该方案适合权限可以通过Cognito用户声明做条件限制的场景,无需切换角色即可实现用户级权限隔离,完全不用编写角色假设相关代码。

配置步骤:

  • 编辑Lambda的执行角色,添加原本需要代入的角色对应的权限策略,通过IAM条件限制权限仅对当前请求的Cognito用户生效,示例策略如下:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "dynamodb:GetItem"
                // 替换为实际需要的权限项
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "cognito-identity.amazonaws.com:sub": "${event.requestContext.authorizer.jwt.claims['cognito:username']}"
                }
                // 可根据需求调整条件,比如按用户组、自定义属性做权限限制
            }
        }
    ]
}
  • 确认API Gateway的Cognito JWT授权器已正确配置,能将Cognito用户声明完整传递到Lambda的event.requestContext.authorizer字段
  • 直接删除原有代码中AssumeRole相关逻辑,使用Lambda默认的SDK凭证即可访问资源,IAM会自动按条件限制权限范围

方案2:中间件自动注入角色假设逻辑(适合必须使用独立角色的场景)

如果你的场景有强多租户隔离要求,必须使用独立的IAM角色,可通过中间件自动完成角色假设,业务代码无需手动处理身份逻辑。

前置配置

首先给Lambda执行角色添加STS角色代入权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Resource": "arn:aws:iam::【你的AWS账号ID】:role/【你的目标角色名】"
        }
    ]
}

同时配置目标角色的信任策略,允许Cognito身份代入:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "cognito-identity.amazonaws.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "cognito-identity.amazonaws.com:aud": "【你的Cognito用户池ID】"
                }
            }
        }
    ]
}

代码实现示例(Node.js)

可以使用Middy等中间件框架,在请求进入业务逻辑前自动完成角色假设,将临时凭证注入到全局SDK配置:

import middy from '@middy/core'
import { STSClient, AssumeRoleWithWebIdentityCommand } from "@aws-sdk/client-sts";
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";

const sts = new STSClient({})

// 自动代入角色中间件
const autoAssumeRoleMiddleware = () => {
  return {
    before: async (handler) => {
      const { event, context } = handler
      // 自动从请求中获取身份信息完成角色代入
      const assumedRole = await sts.send(new AssumeRoleWithWebIdentityCommand({
        RoleArn: '【你的目标角色ARN】',
        RoleSessionName: event.requestContext.authorizer.jwt.claims['cognito:username'],
        WebIdentityToken: event.headers.authorization
      }));
      // 将临时凭证挂载到context,后续所有AWS SDK调用可直接使用
      context.awsCredentials = {
        accessKeyId: assumedRole.Credentials.AccessKeyId,
        secretAccessKey: assumedRole.Credentials.SecretAccessKey,
        sessionToken: assumedRole.Credentials.SessionToken
      }
      // 可提前初始化常用服务客户端挂载到context,业务代码直接调用
      context.s3 = new S3Client({ credentials: context.awsCredentials })
    }
  }
}

// 业务代码完全无需处理角色逻辑
const businessHandler = async (event, context) => {
  // 直接使用预初始化的客户端访问资源即可
  const file = await context.s3.send(new GetObjectCommand({ 
    Bucket: '你的存储桶名', 
    Key: '目标文件路径' 
  }))
  return {
    statusCode: 200,
    body: JSON.stringify(file)
  }
}

export const handler = middy(businessHandler).use(autoAssumeRoleMiddleware())

内容的提问来源于stack exchange,提问作者moltar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:06:05