是否可以向使用 AWS Amplify 预置的 lambda PostAuthenticate 函数授予额外权限?

问题描述 投票:0回答:3

TL;DR: 可以手动更改后身份验证功能配置的放大 CloudFormation 模板以授予权限(例如)IoT AttachPrincipalPolicy

我正在使用 AWS Amplify 和

amplify
CLI 来设置新项目。总的来说,Amplify 让事情变得非常简单,但我一直有这样的感觉,即在事情变得困难或不可能通过 Amplify 控制的项目完成之前,你只能使用 Amplify 走“到目前为止”。

我感兴趣的用例与物联网设置

PubSub
有关 - AWS说明涵盖了如何使其工作,但我会称之为“概念验证”而不是“你应该在其中使用的东西”任何接近生产的东西” - 它涉及在每个 Cognito 身份上手动调用
aws iot attach-principal-policy --policy-name 'myIoTPolicy' --principal '<YOUR_COGNITO_IDENTITY_ID>'

相反,我想做的是在用户登录网站时使用 Post Authentication lambda 函数/事件挂钩来调用 attachPrincipalPolicy(可能首先检查策略是否已附加!)。

也许显然这并不“有效”,我测试过

var iot = new AWS.Iot();

  var params = {
    policyName: 'myIoTPolicy', /* required */
    principal: 'XYZ123XYZ123' /* required */
  };

  try {
    iot.attachPrincipalPolicy(params, function (err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else console.log(data);           // successful response

      callback(null, event);
    });
  } catch (e) {
    console.log(e);           // successful response
  }

最终出现如下错误

AccessDeniedException: User: arn:aws:sts::123123123123123:assumed-role/project82382PostAuthentication-master/project82382PostAuthentication-master is not authorized to perform: iot:AttachPrincipalPolicy on resource: XYZ123XYZ123

问题的核心是,如何以一种在使用 Amplify CLI 修改项目时不会中断的方式授予此 lambda 函数权限?例如,理论上我可以更改

project82382PostAuthentication-cloudformation-template.json
并添加某种配置来授予执行
iot:AttachPrincipalPolicy
的权限,但这会被删除,我想如果/当我更改导致 Amplify CLI 重新生成的配置时CloudFormation 模板?

amazon-web-services aws-lambda aws-amplify aws-amplify-cli
3个回答
8
投票

虽然这是一个手动过程,但请转到 ./amplify/backend/function/your-function-name/your-function-name-cloud-formation-template.json 并找到“lambdaexecutionpolicy” -> “Properties” -> “政策文件”->“声明”。这是一系列政策。只需将另一个对象添加到数组中即可,无论您需要什么。例如,

{
  "Effect": "Allow",
  "Action": [
    "sns:*"
  ],
  "Resource": "*"
}

然后运行

amplify status
,您应该会看到 lambda 的待更新。运行
amplify push
,这些更改将部署到云端。


3
投票

我可以通过更新

amplify/backend/function/{function-name}/custom-policies.json
文件来做到这一点。

我希望能够调用位于 API Gateway 后面的另一个 lambda 函数,因此它看起来像这样,其中“path”是到我的端点的路径,“*”是通配符:

请参阅 aws 文档

[
  {
    "Effect": "Allow",
    "Action": [
      "execute-api:Invoke"
    ],
    "Resource": [
      "arn:aws:execute-api:*:*:*/*/POST/{path}"
    ]
  }
]

就 sns 而言,我想您可以使用 @Demetrios 在他的 answer

中发布的权限之类的内容
[
  {
    "Effect": "Allow",
    "Action": [
      "sns:*"
    ],
    "Resource": "*"
  }
]

0
投票

使用 Amplify Gen 2,您可以使用

backend
对象和 CDK 来实现。

import {defineBackend} from '@aws-amplify/backend';
import {auth} from './auth/resource';
import {data} from './data/resource';
import {storage} from "./storage/resource";
import {postAuthenticationTrigger, postConfirmationSignUpTrigger} from "./functions/resource";
import {PolicyStatement} from "aws-cdk-lib/aws-iam";

const backend = defineBackend({
    auth,
    data,
    storage,
    postConfirmationSignUpTrigger,
    postAuthenticationTrigger
});

const policyStatement = new PolicyStatement();
policyStatement.addResources('*');
policyStatement.addActions('cognito-idp:AdminUpdateUserAttributes');
backend.postConfirmationSignUpTrigger.resources.lambda.addToRolePolicy(policyStatement);

上述策略授予 lambda 函数(在 Cognito 上触发)调用/调用 Cognito 来更新某些用户属性的权限

© www.soinside.com 2019 - 2024. All rights reserved.