AWS CloudFormation 脚本失败 - 不允许 Cognito 使用您的电子邮件身份

AWS CloudFormation Script Fails - Cognito is not allowed to use your email identity

我正在尝试构建一个 CloudFormation 脚本来设置 Cognito 用户池并将其配置为使用自定义电子邮件在注册过程中向用户发送他们的验证码(即发件人:noreply@mydomain.com) .

我在执行我的 AWS CloudFormation 脚本时遇到此错误:

"ResourceStatusReason": "Cognito is not allowed to use your email identity (Service: AWSCognitoIdentityProvider; Status Code: 400; Error Code: InvalidEmailRoleAccessPolicyException; 

我已附加 Cognito 政策以使用我的 SES 电子邮件身份,例如noreply@mydomain.com。在 运行 CloudFormation 脚本之前,我已经在 SES 中手动设置并验证了此电子邮件身份。

这是我的 CloudFormation 配置,允许 Cognito 代表我发送电子邮件,例如来自 noreply@mydomain.com:

  CognitoSESPolicy:
    Type: AWS::IAM::ManagedPolicy
    Description: "Allow Cognito the send email on behalf of email identity (e.g. noreply@example.org)"
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
        - Sid: "ucstmnt0001"
          Effect: "Allow"
          Action:
          - "ses:SendEmail"
          - "ses:SendRawEmail"
          Resource: !FindInMap [ environment, !Ref "Environment", emailARN ]

  SESRole:
    Type: AWS::IAM::Role
    Description: "An IAM Role to allow Cognito to send email on behalf of email identity"
    Properties:
      RoleName: uc-cognito-ses-role
      ManagedPolicyArns:
        - Ref: CognitoSESPolicy
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
            - sts:AssumeRole
            Principal:
              Service:
              - cognito-idp.amazonaws.com
    DependsOn: CognitoSESPolicy

我不确定我做错了什么...

为了他人的利益回答我自己的问题。 AWS SES 有自己的电子邮件托管身份,要求用户在其他 AWS 服务使用之前验证电子邮件的所有权。我的解决方案是使用 AWS 门户手动设置 SES 电子邮件帐户,验证电子邮件帐户,然后在我的 CloudFormation 脚本中引用在 SES 中为电子邮件创建的身份的 ARN。也许 AWS 将来会有办法通过 CloudFormation 脚本创建 SES 身份,但目前似乎需要手动过程来进行初始设置。

最近 运行 研究了这个问题,但仍然找不到通过 Cloudformation 添加它的方法。可以改用 aws ses put-identity-policy

ses_policy=$(cat << EOM
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "cognito-idp.amazonaws.com"
            },
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "${email_arn}"
        }
    ]
}
EOM
)
aws ses put-identity-policy \
  --identity "${email_arn}" \
  --policy-name "${policy_name}" \
  --policy "${ses_policy}"

您可以使用 read 而不是 cat,但我的脚本已经在使用 set -o errexit 并且没有特别的原因不值得更改为纯粹主义者。