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

如何通过IAM授权限制Amplify GraphQL API仅允许指定Lambda访问?

问题描述

我的GraphQL API定义如下:

type MyEntity @model @auth(rules: [
      { allow: owner, ownerField: "ownerId"}
    ]) {
  id: ID!
  ownerId: String!
  strFld: String!
}

我希望名为myLambda的Lambda函数能够查询MyEntity,因此按照IAM授权指引,为MyEntity添加了{ allow: private, provider: iam }规则,Lambda确实可以正常访问了。但该规则同时绕过了所有者权限保护,导致任何通过IAM连接的客户端都能编辑其他所有者的MyEntity。

例如,我的React客户端原本通过用户组权限查询MyEntity,并未特意配置IAM访问权限,但只要将GraphQL查询的授权模式改为GRAPHQL_AUTH_MODE.AWS_IAM,就能读写所有MyEntity,不受所有者限制。

请问在为实体配置IAM授权时,如何限制仅让指定Lambda拥有访问权限?文档提到“IAM可用于管理访问权限”,但未说明需要修改哪些角色/策略来限制外部客户端(如React)的访问。


解决方案

要实现仅让指定Lambda访问MyEntity,同时保留原有的所有者权限控制,你需要移除@auth规则中的IAM开放权限,转而通过Lambda执行角色的精细IAM策略来授权,具体步骤如下:

1. 移除GraphQL实体的开放IAM授权规则

首先修改你的MyEntity定义,删除{ allow: private, provider: iam }这条规则,保留原有的所有者授权:

type MyEntity @model @auth(rules: [
      { allow: owner, ownerField: "ownerId"}
    ]) {
  id: ID!
  ownerId: String!
  strFld: String!
}

这样就不会再对所有IAM实体开放MyEntity的访问权限。

2. 为Lambda执行角色添加精细访问策略

找到你的myLambda对应的IAM执行角色(通常命名类似amplify-<项目名>-<环境>-<数字>-lambdaRole),为其添加一条自定义IAM策略,仅允许该角色访问你的GraphQL API中MyEntity的指定操作:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "graphql:Query",
                "graphql:Mutation"
            ],
            "Resource": [
                "arn:aws:appsync:<区域>:<账号ID>:apis/<API ID>/types/Query/fields/listMyEntities",
                "arn:aws:appsync:<区域>:<账号ID>:apis/<API ID>/types/Query/fields/getMyEntity",
                // 如果需要修改权限,添加对应的Mutation资源,比如:
                // "arn:aws:appsync:<区域>:<账号ID>:apis/<API ID>/types/Mutation/fields/updateMyEntity"
            ]
        }
    ]
}
  • 替换<区域>、<账号ID>、<API ID>为你实际的AWS资源信息。
  • 根据需求调整Action和Resource:比如只需要查询就保留graphql:Query和对应的查询字段;如果需要修改则添加graphql:Mutation和对应的操作字段。

3. 确保客户端IAM角色无GraphQL API访问权限

检查你的React客户端所使用的IAM角色(比如Cognito身份池的未认证/认证角色),确保这些角色没有被赋予访问该GraphQL API的权限。这样即使客户端切换到AWS_IAM授权模式,也无法访问MyEntity数据。

4. 在Lambda中使用IAM模式调用GraphQL API

在myLambda代码中,依然使用IAM授权模式调用GraphQL API(Amplify会自动使用Lambda的执行角色进行身份验证),示例代码:

import { Amplify, API, graphqlOperation } from 'aws-amplify';
import awsExports from './aws-exports';

Amplify.configure(awsExports);

const listMyEntities = `
  query ListMyEntities {
    listMyEntities {
      items {
        id
        ownerId
        strFld
      }
    }
  }
`;

export const handler = async () => {
  try {
    const response = await API.graphql({
      query: listMyEntities,
      authMode: 'AWS_IAM' // 指定IAM授权模式
    });
    return {
      statusCode: 200,
      body: JSON.stringify(response.data.listMyEntities.items)
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify(error)
    };
  }
};

这样配置后,只有myLambda的执行角色拥有访问MyEntity的权限,其他IAM实体(如客户端)无法通过IAM模式访问,同时原有的所有者授权规则依然生效,客户端只能访问自己拥有的MyEntity数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:25:25