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

Posted

技术标签:

【中文标题】AWS CloudFormation 脚本失败 - 不允许 Cognito 使用您的电子邮件身份【英文标题】:AWS CloudFormation Script Fails - Cognito is not allowed to use your email identity 【发布时间】:2019-04-20 07:00:09 【问题描述】:

我正在尝试构建一个 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

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

【问题讨论】:

即使手动验证电子邮件,我也会遇到同样的错误。你能分享你的代码的更大的 sn-p 以便我看看我做错了什么吗? 【参考方案1】:

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

【讨论】:

感谢分享!您能否判断您在上面发布的政策是否仍然相关,或者您必须通过 SES 页面上的“身份政策”设置手动创建它? 您仍然需要附加一个策略,该策略授予 Cognito(或您要从中发送电子邮件的任何其他服务)使用 SES 服务发送电子邮件所需的权限。例如:``` # IAM: MANAGED POLICY IamManagedPolicySnsPublish:类型:“AWS::IAM::ManagedPolicy” 属性:描述:“发布 SNS 消息权限的托管策略” PolicyDocument:版本:“2012-10-17”声明: - 效果: 允许操作: - sns:Publish Resource: "*" ```【参考方案2】:

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

【讨论】:

以上是关于AWS CloudFormation 脚本失败 - 不允许 Cognito 使用您的电子邮件身份的主要内容,如果未能解决你的问题,请参考以下文章

AWS::ElasticBeanstalk::ConfigurationTemplate 的 AWS CloudFormation 模板失败

无法通过 cloudformation yaml 创建 AWS::ECS::Service,模型验证失败

AWS cloudformation 嵌套堆栈因模板 URL 失败

AWS cloudFormation LAMP 堆栈失败

Beanstalk 上示例 PHP 应用程序的 AWS CloudFormation 模板失败

创建 CloudFront 分配时出现神秘的 CloudFormation 失败