Amazon web services 在更新堆栈操作上删除AWS Cognito Lambda触发器

Amazon web services 在更新堆栈操作上删除AWS Cognito Lambda触发器,amazon-web-services,amazon-cloudformation,amazon-cognito,Amazon Web Services,Amazon Cloudformation,Amazon Cognito,我️ 我注意到,每当部署新的CloudFormation堆栈更改时,我的用户池触发器都会被删除,并且必须在AWS仪表板中手动或以编程方式重新添加。这有点令人担忧,因为这些触发器通过Cognito和后端系统之间的通信执行一些关键操作 起初我️ 虽然这是我们正在使用的部署框架,但这里是一个CF模板I的简单示例️ 能够通过以下方式复制它: 更新以反映Lambda对用户池的附件 { "AWSTemplateFormatVersion": "2010-09-09"

我️ 我注意到,每当部署新的CloudFormation堆栈更改时,我的用户池触发器都会被删除,并且必须在AWS仪表板中手动或以编程方式重新添加。这有点令人担忧,因为这些触发器通过Cognito和后端系统之间的通信执行一些关键操作

起初我️ 虽然这是我们正在使用的部署框架,但这里是一个CF模板I的简单示例️ 能够通过以下方式复制它:

更新以反映Lambda对用户池的附件

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "UserPool": {
      "Type": "AWS::Cognito::UserPool",
      "Properties": {
        "UserPoolName": "test",
        "UsernameAttributes": [
          "email"
        ],
        "EmailVerificationMessage": "Your verification code is {####}.",
        "EmailVerificationSubject": "Your verification code",
        "Policies": {
          "PasswordPolicy": {
            "MinimumLength": 8,
            "RequireLowercase": true,
            "RequireNumbers": true
          }
        }
      }
    },
    "UserPoolClient": {
      "Type": "AWS::Cognito::UserPoolClient",
      "Properties": {
        "ClientName": "Test Client",
        "UserPoolId": {
          "Ref": "UserPool"
        },
        "ExplicitAuthFlows": [
          "ALLOW_REFRESH_TOKEN_AUTH",
          "ALLOW_USER_PASSWORD_AUTH",
          "ALLOW_USER_SRP_AUTH"
        ],
        "GenerateSecret": false
      }
    },
    "PreSignUpHandlerLambdaFunction": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Role": "arn:aws:iam::...",
        "Code": {
          "S3Bucket": "code-bucket",
          "S3Key": "code-bucket/functions.zip"
        },
        "Handler": "handlers/pre-sign-up.default",
        "Runtime": "nodejs12.x",
        "FunctionName": "test-preSignUpHandler",
        "MemorySize": 1024,
        "Timeout": 6
      }
    },
    "PreSignUpHandlerCustomCognitoUserPool1": {
      "Type": "Custom::CognitoUserPool",
      "Version": 1,
      "DependsOn": [
        "PreSignUpHandlerLambdaFunction"
      ],
      "Properties": {
        "ServiceToken": "arn:aws:lambda:...",
        "FunctionName": "test-preSignUpHandler",
        "UserPoolName": "test",
        "UserPoolConfigs": [
          {
            "Trigger": "PreSignUp"
          }
        ]
      }
    }
  }
}

我️ 已经深入研究了更新生成的CloudWatch日志,但是关于用户池更新和触发器的删除,没有什么是透明的。
还有其他人经历过这种情况吗?有什么解决办法吗?

这是CloudFormation的预期行为。当在堆栈更新中检测到配置漂移时,它将使其与堆栈模板一致。如果要保留更改,应在CFN模板中指定触发器。请确保在资源策略中授予cognito访问权限:

{
“版本”:“2012-10-17”,
“Id”:“默认值”,
“声明”:[
{
“Sid”:“lambda允许cognito我的函数”,
“效果”:“允许”,
“委托人”:{
“服务”:“cognito idp.amazonaws.com”
},
“操作”:“lambda:InvokeFunction”,
“资源”:“arn:aws:lambda:us-east-1:123456789012:function:my function”,
“条件”:{
“StringEquals”:{
“AWS:SourceAccount”:“123456789012”
},
“阿恩利克”:{
“AWS:SourceArn”:“arn:AWS:cognito idp:us-east-1:123456789012:userpool/us-east-1_myUserPoolId”
}
}
}
]
}

在CF模板中指定触发器也会分离触发器,这就是问题产生的原因。您已为允许cognito执行访问分配了正确的lambda权限?嘿,Andrew,我️ 感谢您的关注。是的,所有触发器都具有调用访问权限,即使在CF模板中指定为触发器,此行为仍将保持。我已经更新了我的帖子,以反映正在部署的内容的更准确版本️ 我已经注意到我们的部署框架以一种非传统的方式连接Lambda(它从YML生成CF模板)。我️ 我指的是更新后的示例中包含的“Custom::CognitoUserPool”资源。您使用的是什么框架?