用于管理amazon ses域的aws cloudformation自定义资源
aws-cfn-ses-domain的Python项目详细描述
aws cloudformation ses域自定义资源
awscloudformation提供了几种内置的amazon ses资源类型,
但奇怪的是忽略了管理ses域身份的任何方法。这个包实现
acustom::ses_domain
cloudformation自定义资源
提供缺失的功能。
您可以使用它来设置一个域,以便通过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嵌套堆栈
复制 然后在cloudformation模板中,使用嵌套堆栈创建lambda
现在可以像这样使用 如果您希望从源代码构建并上载 要在cloudformation模板中使用 定义实现 声明a 声明用于管理SES的资源
必需的DNS条目,传递给它 下面是cloudformation.yaml模板中的外观… a 实现 必需:是 键入:字符串 更新需要:不支持更新 您希望通过Amazon SES发送和/或接收电子邮件时提供的域名,
例如 有关详细信息,请参见验证Amazon SES中的域
在亚马逊SES开发者指南中。 必需:是 键入:字符串 更新需要:替换 是否启用域中的出站Amazon SES电子邮件。如果 必需:否 类型:布尔型 默认值: 更新需要:无中断 是否启用域的入站Amazon SES电子邮件。如果 必需:否 类型:布尔型 默认值: 更新需要:无中断 在发送来自域的自定义邮件时,使用域的子域
通过亚马逊SES。默认值是 要禁用使用来自域的自定义邮件(而不是使用ses的默认邮件
amazonses.com,设置为空字符串: 只有当 有关详细信息,请参见使用来自域的自定义邮件
在亚马逊SES开发者指南中。 必需:否 键入:字符串 默认值: 更新要求:不中断 要包含在生成的DNS项中的自定义DMARC值。默认将启用
以"仅报告"模式发送您的出站电子邮件的DMARC。注意,必须包含
整个字符串的双引号(需要用json转义或换行
在Yaml的单引号中)。例子: 要禁用生成dmarc记录,请设置为空字符串: 只有当 有关更多信息,请参见dmarc.org概述 必需:否 键入:字符串 默认值: 更新需要:无中断 包含在生成的DNS记录中的生存时间值(秒)。 必需:否 键入:字符串 默认值: 更新需要:无中断 用于确定amazon ses的aws区域smtp端点,
例如, 必需:否 键入:字符串 默认值: 更新需要:无中断 当 a 指定DNS记录的对象列表
对于 它适合用作
如果您更新一个 可在标准区域文件中使用的字符串列表
示例: 如果您使用的是除路由53以外的dns提供程序,则这可能非常有用。为了
例如,要在堆栈的输出中包含区域文件项,请使用类似于: a
,没有任何尾随句点。aws cfn ses domain version.lambda.zip
aws cfn ses domain version.cf.yaml
此存储库的云信息模板
发布页面到运行您的
云层堆积。这个bucket需要从cloudformation中读取,但是
不必公开。自定义::ses_域的函数和iam角色
类型: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_域
代码,
请参见开发部分。用法
自定义::ses_域
资源,您将
通常:自定义::ses_域的aws lambda函数
自定义资源类型,如上面的安装所示。
自定义::ses_domain
用于Amazon SES域的资源,指定
无论您需要什么样的SES选项。route53recordsets
自定义::ses_域的属性。(或者如果您不使用53号公路,请使用
其他自定义::ses_域
与您的DNS提供商记录。)
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
属性
自定义::ses_域
资源支持以下属性:服务令牌
自定义::ses_domain
类型的lambda函数的arn。
有关获取此信息的简单方法,请参见上面的安装。
(这是所有云层的标准属性
aws::cloudformation::customresource类型。)域
example.com
。(不需要拖尾期,但可以简化
使用确实需要的53号公路主机名。)启用发送
true
(默认值),
生成的dns记录将包括ses所需的验证令牌和dkim
条目. true
启用接收
true
,则
DNS记录将包括SES所需的验证令牌和入站MX条目。false
mailfromsubdomain
mail
(因此,如果您的custom::ses_domain
资源
域:example.com
,默认情况下,它将在ses中设置为
来自域的邮件。生成的dns记录将包括ses的
域中邮件所需的SPF和反馈MX条目。mailfromsubdomain:''
enablesend
为true
'mail'
customdmarc
CustomDMARC:'"v=DMARC1;p=reject;pct=100;rua=mailto:postmaster@example.com"'
customdmarc:''
enablesend
为true
'"v=dmarc1;p=none;pct=100;sp=none;aspf=r;""
ttl
'1800'
地区
(字符串):域"US-East-1"
。
默认值是配置自定义::ses_域
资源的区域。
(这一定是一个支持amazon ses的地区,而且您不太可能
要覆盖此项。)${aws::region}
返回值
REF
自定义::ses_域
资源提供给ref
内在函数时,
ref
返回域(不带任何尾随句点)。fn::getatt
custom::ses_domain
resource返回几个属性
可与其他云信息资源一起使用以维护所需的dns记录
用于您的Amazon SES域。路由53个记录集
自定义::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.']
Outputs:ZoneFileEntries:Description:Add these lines to the zone file at your DNS provider.Value:!Join["\n",!GetAttMySESDomain.ZoneFileEntries]
其他属性
custom::ses_domain
资源提供了其他几个与ses相关的属性
可能有助于生成自定义DNS记录或其他目的:< < >代码>域
VerificationToken
(字符串):从返回的VerificationToken
ses:verifydomainidentitydkimtokens
(字符串列表):从
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/prefix
或s3u prefix=
,
如果需要。
如果要更改代码,则需要运行测试(make test
)和静态代码
检查(mak上传前请检查。
附加的开发定制变量记录在顶部 生成文件的。
备选方案
这些包提供了类似的功能(并提供了一些有用的背景知识
对于自定义::ses_域
):
- https://medium.com/poka-techblog/verify-domains-for-ses-using-cloudformation-8dd185c9b05c
- https://github.com/binxio/cfn ses provider
这两个函数都直接从lambda函数管理route 53记录 (而不是留给其他云形成资源),他们可以支持 与此软件包相比,Amazon SES域标识选项更少。
未来
自定义::ses_域的实现目前缺少这些amazon ses 域标识功能:
- 控制sns反馈通知和转发选项 (ses:setidentitynotificationtopic和ses:setidentityfeedbackforwardingenabled)
- 控制简单的dkim启用(ses:setidentitydkimsenabled当前,
自定义::ses_域
假定启用发送时,还需要简单的dkim)
添加它们可能很简单;欢迎您的贡献。
你是亚马逊的吗?如果有一个aws::ses::domain
资源就太好了
云层形成的标准。请考虑采用或废弃此包装。
(如果您想让我分配或转移,请直接联系。)