{ "info": { "author": "Mike Edmunds", "author_email": "medmunds@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Topic :: System :: Installation/Setup", "Topic :: System :: Systems Administration" ], "description": "# AWS CloudFormation SES Domain Custom Resource\n\nAWS [CloudFormation][] provides several built-in Amazon SES resource types,\nbut oddly omits any way to manage SES domain identities. This package implements\na `Custom::SES_Domain` CloudFormation [custom resource][custom-resource] that\noffers that missing functionality. \n\nYou can use it to provision a domain for sending and/or receiving email through SES.\nThe `Custom::SES_Domain` resource handles all required Amazon SES identity management \ncalls and outputs SES's required DNS entries. \n\nThe `Custom::SES_Domain` resource deliberately avoids manipulating Route 53 itself. \nInstead, it returns an attribute that helps your template use a standard\n[`AWS::Route53::RecordSetGroup`][RecordSetGroup] resource for those DNS entries. \nOr if you prefer, you can use other `Custom::SES_Domain` return values to customize \nDNS records for Route 53, or to use some other DNS provider entirely.\n\nAs an added benefit, this approach lets CloudFormation determine the optimal DNS \nupdating strategy if you change your stack (e.g., to add inbound capability to an \nSES domain originally provisioned for sending only).\n\n**Documentation**\n\n* [Installation](#installation)\n* [Usage](#usage)\n * [Properties](#properties)\n * [Return Values](#return-values)\n * [Validating Your Templates](#validating-your-templates)\n* [Development](#development)\n* [Alternatives](#alternatives)\n* [Future](#future)\n\n\n## Installation\n\nThe `Custom::SES_Domain` resource is implemented as an AWS Lambda Function. To use it\nfrom your CloudFormation templates, you'll need to set up that function along with an \nIAM role giving it permission to manage your Amazon SES domains.\n\nThe easiest way to do this is with a CloudFormation [nested stack][NestedStack]: \n\n1. Copy the `aws-cfn-ses-domain-VERSION.lambda.zip` Lambda package and \n `aws-cfn-ses-domain-VERSION.cf.yaml` CloudFormation template from this repository's \n [releases][] page into an S3 bucket in the region where you'll be running your\n CloudFormation stack. This bucket needs to be readable from CloudFormation, but\n need not be public. \n\n2. Then in your CloudFormation template, use a nested stack to create the Lambda \n Function and IAM role for the `Custom::SES_Domain` type:\n\n```yaml\n CfnSESDomain:\n Type: AWS::CloudFormation::Stack\n Properties:\n TemplateURL: https://s3.amazonaws.com/YOUR_BUCKET/aws-cfn-ses-domain-VERSION.cf.yaml\n Parameters:\n - LambdaCodeS3Bucket: YOUR_BUCKET\n - LambdaCodeS3Key: aws-cfn-ses-domain-VERSION.lambda.zip\n```\n\nThe `Custom::SES_Domain` resource type is now available to use like this (see \n[Usage](#usage) below for the full list of properties and return values):\n\n```yaml\n MySESDomain:\n Type: Custom::SES_Domain\n Properties:\n # ServiceToken must be the Arn of the Lambda Function:\n ServiceToken: !GetAtt CfnSESDomain.Outputs.Arn\n Domain: \"example.com\"\n # ...\n```\n\nIf you'd prefer to build and upload the `Custom::SES_Domain` code from source, \nsee the [Development](#development) section.\n\n\n\n## Usage\n\nTo work with a `Custom::SES_Domain` resource in your CloudFormation template, you'll\ntypically:\n\n1. Define the AWS Lambda Function that implements the `Custom::SES_Domain` CloudFormation \n custom resource type, as shown in [Installation](#installation) above.\n\n2. Declare a `Custom::SES_Domain` resource for your Amazon SES domain, specifying \n whatever SES options you need.\n\n3. Declare an [`AWS::Route53::RecordSetGroup`][RecordSetGroup] resource to manage SES's \n required DNS entries, passing it the [`Route53RecordSets`](#route53recordsets) \n attribute of your `Custom::SES_Domain`. (Or if you're not using Route 53, use the \n other `Custom::SES_Domain` [return values](#return-values) to create the appropriate \n records with your DNS provider.)\n\nHere's how that looks in a cloudformation.yaml template\u2026\n\n```yaml\nResources:\n # 1. Define the Custom::SES_Domain's Lambda Function via a nested stack. \n CfnSESDomain:\n Type: AWS::CloudFormation::Stack\n Properties:\n TemplateURL: https://s3.amazonaws.com/YOUR_BUCKET/aws-cfn-ses-domain-VERSION.cf.yaml\n Parameters:\n - LambdaCodeS3Bucket: YOUR_BUCKET\n - LambdaCodeS3Key: aws-cfn-ses-domain-VERSION.lambda.zip\n\n # 2. Declare a Custom::SES_Domain resource for your SES domain.\n MySESDomain:\n Type: Custom::SES_Domain\n Properties:\n # ServiceToken is the Arn of the Lambda Function defined above:\n ServiceToken: !GetAtt CfnSESDomain.Outputs.Arn\n # Remaining Properties are options for provisioning for your SES domain identity:\n # (Domain is required; all others are optional and shown with their defaults)\n Domain: \"example.com\"\n EnableSend: true\n EnableReceive: false\n MailFromSubdomain: \"mail\"\n TTL: \"1800\"\n CustomDMARC: '\"v=DMARC1; p=none; pct=100; sp=none; aspf=r;\"'\n Region: !Ref \"AWS::Region\"\n\n # 3. Declare a Route 53 RecordSetGroup to manage SES's required DNS entries.\n # (This assumes you already have a Route 53 hosted zone for your domain;\n # if not, you'll also want an AWS::Route53::HostedZone resource for it.\n # Or if you don't use Route 53, see \"Return Values\" for other DNS options.)\n MyRoute53RecordsForSES:\n Type: AWS::Route53::RecordSetGroup\n Properties:\n HostedZoneName: \"example.com.\"\n # The Route53RecordSets attribute specifies all DNS records needed:\n RecordSets: !GetAtt MySESDomain.Route53RecordSets\n```\n\n### Properties\n\nA `Custom::SES_Domain` resource supports the following Properties:\n\n##### `ServiceToken`\n\nThe ARN of the Lambda Function that implements the `Custom::SES_Domain` type.\nSee [Installation](#installation) above for a simple way to obtain this.\n(This is a standard property of all CloudFormation \n[AWS::CloudFormation::CustomResource][CustomResource] types.)\n\n*Required:* Yes\n\n*Type:* String\n\n*Update requires:* Updates are not supported\n\n\n##### `Domain` \n\nThe domain name you want to provision for sending and/or receiving email via Amazon SES,\nsuch as `example.com`. (A trailing period is not required, but is allowed to simplify \nworking with Route 53 HostedZone names that do require it.)\n\nFor more information, see [Verifying Domains in Amazon SES][verifying-ses-domains] \nin the *Amazon SES Developer Guide.*\n\n*Required:* Yes\n\n*Type:* String\n\n*Update requires:* Replacement\n\n\n##### `EnableSend`\n\nWhether to enable outbound Amazon SES email from the domain. If `true` (the default),\nthe resulting DNS records will include SES's required verification token and DKIM \nentries.\n\n*Required:* No\n\n*Type:* Boolean\n\n*Default:* `true`\n\n*Update requires:* No interruption\n\n\n##### `EnableReceive`\n\nWhether to enable inbound Amazon SES email to the domain. If `true`, the resulting\nDNS records will include SES's required verification token and inbound MX entry.\n\n*Required:* No\n\n*Type:* Boolean\n\n*Default:* `false`\n\n*Update requires:* No interruption\n\n\n##### `MailFromSubdomain`\n\nThe *subdomain* of [`Domain`](#domain) to use as a custom MAIL FROM domain when sending\nthrough Amazon SES. The default is `mail` (so if your `Custom::SES_Domain` resource has \n`Domain: example.com`, it will by default be provisioned in SES with the custom\nMAIL FROM domain `mail.example.com`). The resulting DNS records will include SES's \nrequired SPF and feedback MX entries for the MAIL FROM domain. \n\nTo *disable* using a custom MAIL FROM domain (and instead use SES's default \n*amazonses.com*), set to an empty string: `MailFromSubdomain: ''`.\n\nThis property is only meaningful when [`EnableSend`](#enablesend) is `true`. \n\nFor more information, see [Using a Custom MAIL FROM Domain][custom-mail-from-domain]\nin the *Amazon SES Developer Guide.*\n\n*Required:* No\n\n*Type:* String\n\n*Default:* `'mail'`\n\n*Update requires:* No interruption\n\n\n##### `CustomDMARC`\n\nA custom DMARC value to include in the resulting DNS entries. The default will enable\nDMARC for your outbound email in \"report only\" mode. Note that you *must* include the\ndouble quotes around the entire string (which requires escaping in JSON or wrapping\nin single quotes in YAML). Example:\n\n```yaml\n CustomDMARC: '\"v=DMARC1; p=reject; pct=100; rua=mailto:postmaster@example.com\"'\n```\n\nTo *disable* generating a DMARC record, set to an empty string: `CustomDMARC: ''`.\n\nThis property is only meaningful when [`EnableSend`](#enablesend) is `true`. \n\nFor more information, see the [DMARC.org Overview][DMARC-overview].\n\n*Required:* No\n\n*Type:* String\n\n*Default:* `'\"v=DMARC1; p=none; pct=100; sp=none; aspf=r;\"'`\n\n*Update requires:* No interruption\n\n\n##### `TTL`\n\nThe time-to-live value to include in resulting DNS records (in seconds).\n\n*Required:* No\n\n*Type:* String\n\n*Default:* `'1800'`\n\n*Update requires:* No interruption\n\n\n##### `Region`\n\nThe AWS Region to use for determining Amazon SES [SMTP endpoints][ses-smtp-endpoints], \ne.g., `\"us-east-1\"`.\nThe default is the region where the `Custom::SES_Domain` resource is being provisioned.\n(This must be a region where Amazon SES is supported, and it's extremely unlikely you'd\nwant to override this.)\n\n*Required:* No\n\n*Type:* String\n\n*Default:* `${AWS::Region}`\n\n*Update requires:* No interruption\n\n\n\n### Return Values\n\n#### Ref\n\nWhen a `Custom::SES_Domain` resource is provided to the `Ref` intrinsic function, \n`Ref` returns the [`Domain`](#domain) (without any trailing period).\n\n\n#### Fn::GetAtt\n\nA `Custom::SES_Domain` resource returns several [`Fn::GetAtt`][GetAtt] attributes that \ncan be used with other CloudFormation resources to maintain the required DNS records \nfor your Amazon SES domain.\n\n\n##### `Route53RecordSets`\n\nA List of [`AWS::Route53::RecordSet`][RecordSet] objects specifying the DNS records\nrequired for the `Custom::SES_Domain` identity.\n\nThis is suitable for use as the `RecordSets` property of an \n[`AWS::Route53::RecordSetGroup`][RecordSetGroup] resource. E.g.:\n\n```yaml\n MyRoute53RecordsForSES:\n Type: AWS::Route53::RecordSetGroup\n Properties:\n # HostedZone or HostedZoneName: ...\n RecordSets: !GetAtt MySESDomain.Route53RecordSets\n```\n\nIf you update a `Custom::SES_Domain` resource, the `Route53RecordSets` attribute \nwill change accordingly, and CloudFormation will figure out the precise updates \nneeded to the Route 53 records.\n\n\n##### `ZoneFileEntries`\n\nA List of String lines that can be used in a standard [Zone File][ZoneFile] to specify \nthe DNS records required for the `Custom::SES_Domain` identity. The *name* field in each\nentry is a fully qualified hostname (ends in a period).\n\nExample:\n```yaml\n[\n '_amazonses.example.com. 1800 IN TXT \"abcde12345\"',\n 'abcde1._domainkey.example.com. 1800 IN CNAME abcde1.dkim.amazonses.com.',\n 'fghij2._domainkey.example.com. 1800 IN CNAME fghij2.dkim.amazonses.com.',\n 'klmno3._domainkey.example.com. 1800 IN CNAME klmno3.dkim.amazonses.com.',\n 'mail.example.com. 1800 IN MX 10 feedback-smtp.us-west-1.amazonses.com.',\n 'mail.example.com. 1800 IN TXT \"v=spf1 include:amazonses.com -all\"',\n '_dmarc.example.com. 1800 IN TXT \"v=DMARC1; p=none; pct=100; sp=none; aspf=r;\"',\n 'example.com. 1800 IN MX 10 inbound-smtp.us-west-1.amazonaws.com.'\n]\n```\n\nThis can be useful if you are working with a DNS provider other than Route 53. For\nexample, to include the zone file entries in your stack's output, use something like:\n\n```yaml\nOutputs:\n ZoneFileEntries:\n Description: Add these lines to the zone file at your DNS provider.\n Value: !Join [\"\\n\", !GetAtt MySESDomain.ZoneFileEntries]\n```\n\n\n##### Other attributes\n\nA `Custom::SES_Domain` resource provides several other SES-related attributes which\nmay be helpful for generating custom DNS records or other purposes:\n\n* `Domain` (String): The [`Domain`](#domain), without any trailing period. \n* `VerificationToken` (String): The VerificationToken returned from \n [SES:VerifyDomainIdentity][VerifyDomainIdentity]\n* `DkimTokens` (List of String): The list of DkimTokens returned from \n [SES:VerifyDomainDkim][VerifyDomainDkim] \n (not available if [`EnableSend`](#enablesend) is false)\n* `MailFromDomain` (String): the custom MAIL FROM domain, e.g., `mail.example.com`\n (not available if [`EnableSend`](#enablesend) is false \n or if [`MailFromSubdomain`](#mailfromsubdomain) is empty)\n* `MailFromMX` (String): the feedback MX host to use with a custom MAIL FROM domain,\n e.g., `feedback-smtp.us-east-1.amazonses.com` \n (not available if [`EnableSend`](#enablesend) is false \n or if [`MailFromSubdomain`](#mailfromsubdomain) is empty)\n* `MailFromSPF` (String): the SPF record value to use with a custom MAIL FROM domain\n (including the double quotes), e.g., `\"v=spf1 include:amazonses.com -all\"`\n (not available if [`EnableSend`](#enablesend) is false \n or if [`MailFromSubdomain`](#mailfromsubdomain) is empty)\n* `DMARC` (String): the DMARC record value to use for outbound mail (including the \n double quotes), e.g., `\"v=DMARC1; p=none; pct=100; sp=none; aspf=r;\"`\n (not available if [`EnableSend`](#enablesend) is false \n or if [`CustomDMARC`](#customdmarc) is empty)\n* `ReceiveMX` (String): the inbound MX host to use for receiving email, e.g.,\n `inbound-smtp.us-east-1.amazonaws.com` \n (not available if [`EnableReceive`](#enablereceive) is false) \n\n\n### Validating Your Templates\n\nIf you use [cfn-lint][] (recommended!) to check your CloudFormation templates,\nyou can include an \"override spec\" so your `Custom::SES_Domain` properties and \nattributes will be validated. Download a copy of \n[CustomSESDomainSpecification.json](CustomSESDomainSpecification.json) and then:\n\n```bash\ncfn-lint --override-spec CustomSESDomainSpecification.json YOUR-TEMPLATE.cf.yaml\n``` \n\n(Without the override-spec, cfn-lint will allow *any* properties and values for\n`Custom::SES_Domain` resources.)\n\n\n## Development\n\nDevelopment requires GNU Make (standard on most Linux-like systems) and [pipenv][].\n(Pipenv is used only to manage the development environment; package requirements are\ntracked in `setup.py`.)\n\nTo set up your development environment, clone the repository and then run `make init`.\n(This just runs `pipenv install`. If you are a package maintainer who will release\nto PyPI, use `pipenv install --dev` instead.)\n\nTo see a list of available make targets, run `make help`.\n\nTo package and upload your own version of the Lambda zip package and the CloudFormation\ntemplates, run `make S3_BUCKET=your_bucket_name upload`. If you just want to build \nlocally without uploading to S3, run `make S3_BUCKET=your_bucket_name all`. You can also\ninclude `S3_PREFIX=your/s3/prefix` or `S3_PREFIX=` in either of these commands,\nif desired.\n\nIf you are changing code, you will want to run tests (`make test`) and static code\nchecks (`make check`) before uploading.\n\nAdditional development customization variables are documented near the top \nof the Makefile.\n\n\n## Alternatives\n\nThese packages offer similar functionality (and provided some helpful background\nfor `Custom::SES_Domain`):\n\n* https://medium.com/poka-techblog/verify-domains-for-ses-using-cloudformation-8dd185c9b05c\n* https://github.com/binxio/cfn-ses-provider\n\nBoth of these manage your Route 53 records directly from the Lambda Function \n(rather than leaving that to other CloudFormation resources), and they may support \nfewer Amazon SES domain identity options than this package.\n\n\n## Future\n\nThe `Custom::SES_Domain` implementation is currently missing these Amazon SES \ndomain identity features:\n\n* Control over SNS feedback notifications and forwarding options\n (SES:SetIdentityNotificationTopic and SES:SetIdentityFeedbackForwardingEnabled)\n* Control over Easy DKIM enabling (SES:SetIdentityDkimEnabled\u2014currently, \n `Custom::SES_Domain` assumes if you are enabling sending, you also want Easy DKIM)\n\nAdding them is likely straightforward; contributions are welcome.\n\nAre you from Amazon? It'd be great to have an `AWS::SES::Domain` resource\nstandard in CloudFormation. Please consider adopting or obsoleting this package. \n(Just reach out if you'd like me to assign or transfer it.)\n\n\n[cfn-lint]:\n https://github.com/awslabs/cfn-python-lint\n[CloudFormation]:\n https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html\n[custom-mail-from-domain]: \n https://docs.aws.amazon.com/ses/latest/DeveloperGuide/mail-from.html\n[custom-resource]: \n https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html\n[CustomResource]:\n https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html\n[DMARC-overview]: \n https://dmarc.org/overview/\n[GetAtt]:\n https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html\n[NestedStack]: \n https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html\n[RecordSet]: \n https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html\n[RecordSetGroup]: \n https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordsetgroup.html\n[pipenv]:\n https://pipenv.readthedocs.io/\n[releases]: \n https://gitlab.com/medmunds/aws-cfn-ses-domain/tags\n[ses-smtp-endpoints]: \n https://docs.aws.amazon.com/ses/latest/DeveloperGuide/regions.html#region-endpoints\n[VerifyDomainDkim]: \n https://docs.aws.amazon.com/ses/latest/APIReference/API_VerifyDomainDkim.html\n[VerifyDomainIdentity]: \n https://docs.aws.amazon.com/ses/latest/APIReference/API_VerifyDomainIdentity.html\n[verifying-ses-domains]: \n https://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-domains.html\n[ZoneFile]: \n https://en.wikipedia.org/wiki/Zone_file\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://gitlab.com/medmunds/aws-cfn-ses-domain", "keywords": "AWS-CloudFormation CloudFormation CloudFormation-custom-resource CustomResource Amazon-SES SES Route53 AWS-Lambda-Function", "license": "Apache License 2.0", "maintainer": "", "maintainer_email": "", "name": "aws-cfn-ses-domain", "package_url": "https://pypi.org/project/aws-cfn-ses-domain/", "platform": "", "project_url": "https://pypi.org/project/aws-cfn-ses-domain/", "project_urls": { "Homepage": "https://gitlab.com/medmunds/aws-cfn-ses-domain" }, "release_url": "https://pypi.org/project/aws-cfn-ses-domain/0.2/", "requires_dist": [ "boto3 ; extra == 'test'" ], "requires_python": ">=3.6.0", "summary": "AWS CloudFormation custom resource for managing Amazon SES domains", "version": "0.2" }, "last_serial": 5178867, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "dbf2ae76f9b7f3fdfc7b15770c8ca508", "sha256": "091a5f8951bf0b1eeb24b43ff99580bdeab36812c4a2193364d492073d45c151" }, "downloads": -1, "filename": "aws_cfn_ses_domain-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "dbf2ae76f9b7f3fdfc7b15770c8ca508", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0", "size": 14627, "upload_time": "2018-11-02T23:56:01", "url": "https://files.pythonhosted.org/packages/d1/a5/cdf2ef70efbd3a1c2b7462bb8aa751901347d160567aaddb3f0360a4f6ce/aws_cfn_ses_domain-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa74559f3e7812d4313624c2c13b0f93", "sha256": "ea145a1f7ccdd238fbb173b8b92c935723b60cc38e2d87951ea23c15b30a9f67" }, "downloads": -1, "filename": "aws-cfn-ses-domain-0.1.tar.gz", "has_sig": false, "md5_digest": "aa74559f3e7812d4313624c2c13b0f93", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 14815, "upload_time": "2018-11-02T23:56:03", "url": "https://files.pythonhosted.org/packages/b3/6c/7a4fd3a4337feba213440d118c4041e5eba005e2c851505aa667a2fea1bd/aws-cfn-ses-domain-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "02a9ed5813144d36c00b4cb12f474ab8", "sha256": "e026f4d6ec3bcebfbcc8bff05751b74f6beaf6d01f474b6aaf38e34c9882310f" }, "downloads": -1, "filename": "aws_cfn_ses_domain-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "02a9ed5813144d36c00b4cb12f474ab8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0", "size": 14844, "upload_time": "2019-04-23T19:05:34", "url": "https://files.pythonhosted.org/packages/3b/c6/b9221634b46ff0ea561e7f8d8f4fb7696d8f1eeca3dd6fc44c9e94adfc48/aws_cfn_ses_domain-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "efeeeee03ee51cdd704e652d6ce548c1", "sha256": "6f9a3be70e5f8ef3563832be92f6aa50cf818018d6cea67276a791a0fb447b67" }, "downloads": -1, "filename": "aws-cfn-ses-domain-0.2.tar.gz", "has_sig": false, "md5_digest": "efeeeee03ee51cdd704e652d6ce548c1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 15609, "upload_time": "2019-04-23T19:05:35", "url": "https://files.pythonhosted.org/packages/a9/16/4c36df831f43a435ecb8f9709ba32160d6a09c32f4ec2178f8b26b8f0955/aws-cfn-ses-domain-0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "02a9ed5813144d36c00b4cb12f474ab8", "sha256": "e026f4d6ec3bcebfbcc8bff05751b74f6beaf6d01f474b6aaf38e34c9882310f" }, "downloads": -1, "filename": "aws_cfn_ses_domain-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "02a9ed5813144d36c00b4cb12f474ab8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0", "size": 14844, "upload_time": "2019-04-23T19:05:34", "url": "https://files.pythonhosted.org/packages/3b/c6/b9221634b46ff0ea561e7f8d8f4fb7696d8f1eeca3dd6fc44c9e94adfc48/aws_cfn_ses_domain-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "efeeeee03ee51cdd704e652d6ce548c1", "sha256": "6f9a3be70e5f8ef3563832be92f6aa50cf818018d6cea67276a791a0fb447b67" }, "downloads": -1, "filename": "aws-cfn-ses-domain-0.2.tar.gz", "has_sig": false, "md5_digest": "efeeeee03ee51cdd704e652d6ce548c1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 15609, "upload_time": "2019-04-23T19:05:35", "url": "https://files.pythonhosted.org/packages/a9/16/4c36df831f43a435ecb8f9709ba32160d6a09c32f4ec2178f8b26b8f0955/aws-cfn-ses-domain-0.2.tar.gz" } ] }