CloudFormationにテンプレートがなかったのでAWS SDKで組んでみた。
前提
- ドメインはRoute53で管理している
- 受信用S3バケットは作成済み
- SESのdefault-rule-setが作成済み
コード
index.js
// Input
var domain = "EXAMPLE.COM";
var s3BucketName = 'S3_BUCKET_NAME';
var mailAddress = "admin@" + domain;
var region = 'us-east-1';
//module
var AWS = require('aws-sdk');
var ses = new AWS.SES({
apiVersion: '2010-12-01',
accessKeyId: "ACCESS_KEY_ID",
secretAccessKey: "SECRET_ACCESS_KEY",
region: region
});
var route53 = new AWS.Route53({
apiVersion: '2014-05-15',
accessKeyId: "ACCESS_KEY_ID",
secretAccessKey: "SECRET_ACCESS_KEY",
region: region
});
//Params
var domainVerificationToken = '';
var params = {
Rule: {
Name: 'mail.' + domain,
Actions: [
{
S3Action: {
BucketName: s3BucketName,
ObjectKeyPrefix: domain
},
},
],
Enabled: true,
Recipients: [
mailAddress,
],
ScanEnabled: true,
TlsPolicy: 'Optional'
},
RuleSetName: 'default-rule-set'
};
// Promise
ses.createReceiptRule(params).promise()
.then(
(data) => {
var domainParams = {
Domain: domain
};
return ses.verifyDomainIdentity(domainParams).promise();
}
).then(
(data) => {
console.log(data);
if ( ! data.VerificationToken) {
throw 'undefined Verification Token.';
}
domainVerificationToken = '"' + data.VerificationToken + '"';
var params = {
DNSName: domain,
MaxItems: '1'
};
return route53.listHostedZonesByName(params).promise();
}
).then(
(data) => {
var HostedZoneId = data.HostedZones[0].Id;
HostedZoneId = HostedZoneId.split('/')[2];
var params = {
ChangeBatch: {
Changes: [
{
Action: 'UPSERT',
ResourceRecordSet: {
Name: '_amazonses.' + domain,
Type: 'TXT',
TTL: '1800',
ResourceRecords: [
{
Value: domainVerificationToken
}
]
}
},{
Action: 'UPSERT',
ResourceRecordSet: {
Name: domain,
Type: 'MX',
TTL: '1800',
ResourceRecords: [
{
Value: "10 inbound-smtp.us-east-1.amazonaws.com"
}
]
}
}
],
},
HostedZoneId: HostedZoneId
};
return route53.changeResourceRecordSets(params).promise();
}
).then(
(data) => {
console.log(data);
}
).catch(
(err) => {
console.log(err);
}
);
このコードを走らせると、「var mailAddress」で設定したアドレス宛に送信されたメールが、SES経由でS3バケットに保存されます。
他のリージョンで使いたい場合、SESが使えるリージョンが限定されていることや、MXレコードのパラメーターがus-east-1決め打ちになってるところらへん要注意です。
おまけ:SESのルールセット登録をJSでやる
var params = {
RuleSetName: 'STRING_VALUE' /* required */
};
ses.createReceiptRuleSet(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
「'default-rule-set'」からこれのRuleSetNameに設定した値に書き換えれば上のスクリプトでも動くはずです。(未検証)