使用 AWS CDK 将 Lambda 触发器添加到导入的 Cognito 用户池

gre*_*Tea 6 amazon-web-services amazon-cognito aws-lambda aws-cdk

我正在尝试使用 AWS CDK 创建一个与现有 AWS 资源相关联的新 lambda,这些资源不是使用 CDK 创建的并且属于不同堆栈的一部分。

我可以使用 CDK 从已经存在的用户池中触发我的 lambda 吗?我已使用以下方法将用户池导入到我的新堆栈中:

const userPool = UserPool.fromUserPoolArn(this, 'poolName, 'arn:aws:cognito-idp:eu-west-1:1234567890:userpool/poolName')

但是,这给了我一个IUserPool没有addTrigger方法的方法。有没有办法将其转换为 aUserPool以便能够触发 lambda(因为我可以看到它UserPool具有该addTrigger方法)?

我已经看到,例如可以使用 CDK 授予我的新 lambda 读取/写入现有 DynamoDB 表的权限。而且我不太明白这里的区别:DynamoDB 是一个现有的 AWS 资源,我正在使用 CDK 将其导入新堆栈,然后允许我的新 lambda 对其进行修改。Cognito 用户池也是一个现有的 AWS 资源,我可以在 CDK 中导入它,但似乎我无法修改它?为什么?

And*_*per 8

本期对此进行了讨论。您可以使用自定义资源将触发器添加到现有用户池:

import * as CustomResources from '@aws-cdk/custom-resources';
import * as Cognito from '@aws-cdk/aws-cognito';
import * as Iam from '@aws-cdk/aws-iam';

const userPool = Cognito.UserPool.fromUserPoolId(this, "UserPool", userPoolId);

new CustomResources.AwsCustomResource(this, "UpdateUserPool", {
      resourceType: "Custom::UpdateUserPool",
      onCreate: {
        region: this.region,
        service: "CognitoIdentityServiceProvider",
        action: "updateUserPool",
        parameters: {
          UserPoolId: userPool.userPoolId,
          LambdaConfig: {
            PreSignUp: preSignUpHandler.functionArn
          },
        },
        physicalResourceId: CustomResources.PhysicalResourceId.of(userPool.userPoolId),
      },
      policy: CustomResources.AwsCustomResourcePolicy.fromSdkCalls({ resources: CustomResources.AwsCustomResourcePolicy.ANY_RESOURCE }),
    });

const invokeCognitoTriggerPermission = {
        principal: new Iam.ServicePrincipal('cognito-idp.amazonaws.com'),
        sourceArn: userPool.userPoolArn
}

preSignUpHandler.addPermission('InvokePreSignUpHandlerPermission', invokeCognitoTriggerPermission)

Run Code Online (Sandbox Code Playgroud)

您还可以使用此方法修改其他用户池设置