用于管理amazon ses域的aws cloudformation自定义资源

aws-cfn-ses-domain的Python项目详细描述


aws cloudformation ses域自定义资源

awscloudformation提供了几种内置的amazon ses资源类型, 但奇怪的是忽略了管理ses域身份的任何方法。这个包实现 acustom::ses_domaincloudformation自定义资源 提供缺失的功能。

您可以使用它来设置一个域,以便通过SES发送和/或接收电子邮件。 自定义::ses_域资源处理所有必需的amazon ses身份管理 调用并输出SES所需的DNS项。

自定义::ses_域资源有意避免操作路由53本身。 相反,它返回一个属性,帮助模板使用标准 aws::route53::recordsetgroup这些DNS条目的资源。 或者如果愿意,可以使用其他自定义::ses_domain返回值进行自定义 路由53的DNS记录,或完全使用其他DNS提供程序。

作为一个额外的好处,这种方法允许cloudformation确定最佳dns 如果更改堆栈,则更新策略(例如,将入站功能添加到 最初设置为只发送的SES域。

文档

安装

自定义::ses_域资源作为aws lambda函数实现。使用它 从您的cloudformation模板中,您需要设置该函数以及 IAM角色授予它管理您的Amazon SES域的权限。

最简单的方法是使用cloudformation嵌套堆栈

  1. 复制aws cfn ses domain version.lambda.zip aws cfn ses domain version.cf.yaml此存储库的云信息模板 发布页面到运行您的 云层堆积。这个bucket需要从cloudformation中读取,但是 不必公开。

  2. 然后在cloudformation模板中,使用嵌套堆栈创建lambda 自定义::ses_域的函数和iam角色类型:

  3. < > >
    CfnSESDomain:Type:AWS::CloudFormation::StackProperties:TemplateURL:https://s3.amazonaws.com/YOUR_BUCKET/aws-cfn-ses-domain-VERSION.cf.yamlParameters:-LambdaCodeS3Bucket:YOUR_BUCKET-LambdaCodeS3Key:aws-cfn-ses-domain-VERSION.lambda.zip

    现在可以像这样使用自定义::ses_域资源类型(请参见 属性和返回值的完整列表的用法如下:

    MySESDomain:Type:Custom::SES_DomainProperties:# ServiceToken must be the Arn of the Lambda Function:ServiceToken:!GetAttCfnSESDomain.Outputs.ArnDomain:"example.com"# ...

    如果您希望从源代码构建并上载自定义::ses_域代码, 请参见开发部分。

    用法

    要在cloudformation模板中使用自定义::ses_域资源,您将 通常:

    1. 定义实现自定义::ses_域的aws lambda函数 自定义资源类型,如上面的安装所示。

    2. 声明a自定义::ses_domain用于Amazon SES域的资源,指定 无论您需要什么样的SES选项。

    3. 声明用于管理SES的资源 必需的DNS条目,传递给它route53recordsets 自定义::ses_域的属性。(或者如果您不使用53号公路,请使用 其他自定义::ses_域 与您的DNS提供商记录。)

    4. < > >

      下面是cloudformation.yaml模板中的外观…

      Resources:# 1. Define the Custom::SES_Domain's Lambda Function via a nested stack. CfnSESDomain:Type:AWS::CloudFormation::StackProperties:TemplateURL:https://s3.amazonaws.com/YOUR_BUCKET/aws-cfn-ses-domain-VERSION.cf.yamlParameters:-LambdaCodeS3Bucket:YOUR_BUCKET-LambdaCodeS3Key:aws-cfn-ses-domain-VERSION.lambda.zip# 2. Declare a Custom::SES_Domain resource for your SES domain.MySESDomain:Type:Custom::SES_DomainProperties:# ServiceToken is the Arn of the Lambda Function defined above:ServiceToken:!GetAttCfnSESDomain.Outputs.Arn# Remaining Properties are options for provisioning for your SES domain identity:# (Domain is required; all others are optional and shown with their defaults)Domain:"example.com"EnableSend:trueEnableReceive:falseMailFromSubdomain:"mail"TTL:"1800"CustomDMARC:'"v=DMARC1;p=none;pct=100;sp=none;aspf=r;"'Region:!Ref"AWS::Region"# 3. Declare a Route 53 RecordSetGroup to manage SES's required DNS entries.#    (This assumes you already have a Route 53 hosted zone for your domain;#    if not, you'll also want an AWS::Route53::HostedZone resource for it.#    Or if you don't use Route 53, see "Return Values" for other DNS options.)MyRoute53RecordsForSES:Type:AWS::Route53::RecordSetGroupProperties:HostedZoneName:"example.com."# The Route53RecordSets attribute specifies all DNS records needed:RecordSets:!GetAttMySESDomain.Route53RecordSets

      属性

      a自定义::ses_域资源支持以下属性:

      服务令牌

      实现自定义::ses_domain类型的lambda函数的arn。 有关获取此信息的简单方法,请参见上面的安装。 (这是所有云层的标准属性 aws::cloudformation::customresource类型。)

      必需:

      键入:字符串

      更新需要:不支持更新

      您希望通过Amazon SES发送和/或接收电子邮件时提供的域名, 例如example.com。(不需要拖尾期,但可以简化 使用确实需要的53号公路主机名。)

      有关详细信息,请参见验证Amazon SES中的域 在亚马逊SES开发者指南中。

      必需:

      键入:字符串

      更新需要:替换

      启用发送

      是否启用域中的出站Amazon SES电子邮件。如果true(默认值), 生成的dns记录将包括ses所需的验证令牌和dkim 条目.

      必需:

      类型:布尔型

      默认值:true

      更新需要:无中断

      启用接收

      是否启用域的入站Amazon SES电子邮件。如果true,则 DNS记录将包括SES所需的验证令牌和入站MX条目。

      必需:

      类型:布尔型

      默认值:false

      更新需要:无中断

      mailfromsubdomain

      在发送来自域的自定义邮件时,使用域的子域 通过亚马逊SES。默认值是mail(因此,如果您的custom::ses_domain资源 域:example.com,默认情况下,它将在ses中设置为 来自域的邮件。生成的dns记录将包括ses的 域中邮件所需的SPF和反馈MX条目。

      要禁用使用来自域的自定义邮件(而不是使用ses的默认邮件 amazonses.com,设置为空字符串:mailfromsubdomain:''

      只有当enablesendtrue

      时,此属性才有意义。

      有关详细信息,请参见使用来自域的自定义邮件 在亚马逊SES开发者指南中。

      必需:

      键入:字符串

      默认值:'mail'

      更新要求:不中断

      customdmarc

      要包含在生成的DNS项中的自定义DMARC值。默认将启用 以"仅报告"模式发送您的出站电子邮件的DMARC。注意,必须包含 整个字符串的双引号(需要用json转义或换行 在Yaml的单引号中)。例子:

      CustomDMARC:'"v=DMARC1;p=reject;pct=100;rua=mailto:postmaster@example.com"'

      要禁用生成dmarc记录,请设置为空字符串:customdmarc:''

      只有当enablesendtrue

      时,此属性才有意义。

      有关更多信息,请参见dmarc.org概述

      必需:

      键入:字符串

      默认值:'"v=dmarc1;p=none;pct=100;sp=none;aspf=r;""

      更新需要:无中断

      ttl

      包含在生成的DNS记录中的生存时间值(秒)。

      必需:

      键入:字符串

      默认值:'1800'

      更新需要:无中断

      地区

      用于确定amazon ses的aws区域smtp端点, 例如,"US-East-1"。 默认值是配置自定义::ses_域资源的区域。 (这一定是一个支持amazon ses的地区,而且您不太可能 要覆盖此项。)

      必需:

      键入:字符串

      默认值:${aws::region}

      更新需要:无中断

      返回值

      REF

      自定义::ses_域资源提供给ref内在函数时, ref返回域(不带任何尾随句点)。

      fn::getatt

      acustom::ses_domainresource返回几个属性 可与其他云信息资源一起使用以维护所需的dns记录 用于您的Amazon SES域。

      路由53个记录集

      指定DNS记录的对象列表 对于自定义::ses_域标识是必需的。

      它适合用作 aws::route53::recordsetgroup资源。例如:

      MyRoute53RecordsForSES:Type:AWS::Route53::RecordSetGroupProperties:# HostedZone or HostedZoneName: ...RecordSets:!GetAttMySESDomain.Route53RecordSets

      如果您更新一个custom::ses_domain资源,则route53recordsets属性 将相应地改变,cloudformation将计算出精确的更新 需要53路记录。

      分区入口

      可在标准区域文件中使用的字符串列表 自定义::ses_域标识所需的DNS记录。每个 条目是完全限定的主机名(以句点结尾)。

      示例:

      ['_amazonses.example.com.1800INTXT"abcde12345"','abcde1._domainkey.example.com.1800INCNAMEabcde1.dkim.amazonses.com.','fghij2._domainkey.example.com.1800INCNAMEfghij2.dkim.amazonses.com.','klmno3._domainkey.example.com.1800INCNAMEklmno3.dkim.amazonses.com.','mail.example.com.1800INMX10feedback-smtp.us-west-1.amazonses.com.','mail.example.com.1800INTXT"v=spf1include:amazonses.com-all"','_dmarc.example.com.1800INTXT"v=DMARC1;p=none;pct=100;sp=none;aspf=r;"','example.com.1800INMX10inbound-smtp.us-west-1.amazonaws.com.']

      如果您使用的是除路由53以外的dns提供程序,则这可能非常有用。为了 例如,要在堆栈的输出中包含区域文件项,请使用类似于:

      Outputs:ZoneFileEntries:Description:Add these lines to the zone file at your DNS provider.Value:!Join["\n",!GetAttMySESDomain.ZoneFileEntries]
      其他属性

      acustom::ses_domain资源提供了其他几个与ses相关的属性 可能有助于生成自定义DNS记录或其他目的:

        < < >代码>域(字符串):域,没有任何尾随句点。
      • VerificationToken(字符串):从返回的VerificationToken ses:verifydomainidentity
      • dkimtokens(字符串列表):从 ses:verifydomaindkim (如果enablesend为false,则不可用)
      • mail from domain(字符串):来自域的自定义邮件,例如mail.example.com (如果enablesend为false,则不可用 或者如果mailfromsubdomain为空)
      • mail from mx(字符串):要与来自域的自定义邮件一起使用的反馈mx主机, 例如,反馈smtp.us-east-1.amazonses.com (如果enablesend为false,则不可用 或者如果mailfromsubdomain为空)
      • mail from spf(字符串):要与来自域的自定义邮件一起使用的spf记录值 (包括双引号),例如,"v=spf1 include:amazonses.com-all" (如果enablesend为false,则不可用 或者如果mailfromsubdomain为空)
      • dmarc(字符串):用于出站邮件的dmarc记录值(包括 双引号),例如,"v=dmarc1;p=none;pct=100;sp=none;aspf=r;" (如果enablesend为false,则不可用 或者如果customdmarc为空)
      • receivemx(字符串):用于接收电子邮件的入站mx主机,例如, 入站smtp.us-east-1.amazonaws.com (如果enableereceive为false,则不可用)

      验证模板

      如果您使用cfn lint(推荐!)要检查云信息模板, 您可以包含一个"override spec",以便您的自定义::ses\u域属性和 属性将被验证。下载的副本 customsesdomainspecification.json然后:

      cfn-lint --override-spec CustomSESDomainSpecification.json YOUR-TEMPLATE.cf.yaml
      

      (如果没有覆盖规范,cfn lint将允许 自定义::ses_域资源。)

      开发

      开发需要gnu make(在大多数类似linux的系统上是标准的)和pipenv。 (pipenv仅用于管理开发环境;包要求是 跟踪到setup.py

      要设置开发环境,请克隆存储库,然后运行make init。 (这只是运行pipenv install。如果您是将发布 要使用pypi,请改用pipenv install--dev

      要查看可用生成目标的列表,请运行生成帮助

      打包并上传您自己版本的lambda zip包和cloudformation 模板,运行make s3_bucket=your_bucket_name upload。如果你只是想建造 在本地不上传到s3,运行make s3_bucket=your_bucket_name all。你也可以 在其中一个命令中包含s3u prefix=your/s3/prefixs3u prefix=, 如果需要。

      如果要更改代码,则需要运行测试(make test)和静态代码 检查(mak上传前请检查。

      附加的开发定制变量记录在顶部 生成文件的。

      备选方案

      这些包提供了类似的功能(并提供了一些有用的背景知识 对于自定义::ses_域):

      这两个函数都直接从lambda函数管理route 53记录 (而不是留给其他云形成资源),他们可以支持 与此软件包相比,Amazon SES域标识选项更少。

      未来

      自定义::ses_域的实现目前缺少这些amazon ses 域标识功能:

      • 控制sns反馈通知和转发选项 (ses:setidentitynotificationtopic和ses:setidentityfeedbackforwardingenabled)
      • 控制简单的dkim启用(ses:setidentitydkimsenabled当前, 自定义::ses_域假定启用发送时,还需要简单的dkim)

      添加它们可能很简单;欢迎您的贡献。

      你是亚马逊的吗?如果有一个aws::ses::domain资源就太好了 云层形成的标准。请考虑采用或废弃此包装。 (如果您想让我分配或转移,请直接联系。)

      欢迎加入QQ群-->: 979659372 Python中文网_新手群

      推荐PyPI第三方库


热门话题
java为什么我们不能将ArrayList<Integer>传递给具有(Integer…)的方法参数   java Spring RestTemplate映射JSON对映射的响应引发不匹配的PutException   在系统中找到java Selenium元素,但在Jenkins中未找到   java在Android中使用JavaMail API发送电子邮件,而不使用默认/内置应用程序   数组如何在Java数据结构中同时存储数字和相应的单词?   为什么“+”运算符未定义?JAVA   java如何在游戏中添加高分系统?   java在球门碰撞中区分球和球员   java如何使用SpringSecurity4.0.1使用Auth令牌实现Rest完整Web服务。释放   java如何解决这个错误:Android资源链接失败?   java多线程文件处理和数据库批插入   导致Tomcat失败的java无用块线程   java主线程做了太多的工作,尽管我使用了异步线程(laggy UI)   在Java FX 2.0中滚动锚定节点时,锚定始终可见?   java使用EJB3中的客户机jar和设计模式