6

我正在尝试构建一个 CloudFormation 脚本来设置 Cognito 用户池并将其配置为使用自定义电子邮件在注册过程中向用户发送其验证代码(即 FROM: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

我不确定我在这里做错了什么......

4

2 回答 2

7

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

于 2018-11-29T04:12:51.373 回答
0

最近遇到了这个问题,仍然找不到通过 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并且不值得更改为纯粹主义者,没有特别的原因。

于 2020-08-26T21:32:47.817 回答