Open12
CDK で SES Email Receiving 設定を管理したい
背景
AWS コンソールから作成された SES の email 受信設定が存在するので、それを CDK で管理する方法に移行したい。
email 受信ルールとして、S3 に保存した後 Lambda 関数を呼び出すようになっている。
その Lambda 関数も CDK で管理する。
Amazon SImple Email Service Construct Library
既存の Email Identity の参照
static method が用意されている
static fromEmailIdentityName(scope, id, emailIdentityName)
import * as ses from 'aws-cdk-lib/aws-ses';
ses.EmailIdentity.fromEmailIdentityName(this, 'id', 'email identity name')
既存の Receipt Rule Set の参照
static fromReceiptRuleSetName(scope, id, receiptRuleSetName)
既存の Rule Set を CDK で参照して、Rule の更新などができそうなことは判明したが、 Rule Set 全体を CDK で作り直すほうが良さそう。
受信メールの暗号化に利用する KMS Managed Key を参照する
Key.fromLookup()
が使えそう
SSM Parameter Store の参照権限を Lambda に付与する
StringParemeter.fromSecureStringParameterAttributes()
// SSM Parameter Store を参照
const fooParams = ssm.StringParameter.fromSecureStringParameterAttributes(this, 'FooBar', {
parameterName: `/foo/bar`
});
// Lambda に参照権限を付与する (lambdaFunction は cdk.aws_lambda.Function)
fooParams.grantRead(lambdaFunction);
SecureString の復号のために kms:Decrypt
が必要そう
以下も追加する
// SSM Parameter Store の SecureString を参照するための KMS Key の権限を Lambda に付与する
const ssmKmsKey = kms.Key.fromLookup(this, 'SSMKmsKey', {
aliasName: 'alias/aws/ssm'
});
ssmKmsKey.grantDecrypt(lambdaFunction);
CDK で作成した Rule Set を Active にしたい
今のところ Rule Set を Active にする方法が CloudFormation に用意されいないらしいので、CDK でも対応していないらしいが、 Custom Resource を利用することで回避できる。
上記からコードを引用:
// The rule set needs to be activated: https://docs.aws.amazon.com/ses/latest/APIReference/API_SetActiveReceiptRuleSet.html
const setActiveReceiptRuleSetSdkCall: cr.AwsSdkCall = {
service: 'SES',
action: 'setActiveReceiptRuleSet',
physicalResourceId: cr.PhysicalResourceId.of('SesCustomResource'),
parameters: {
RuleSetName: ruleSet.receiptRuleSetName,
}
};
new cr.AwsCustomResource(this, "setActiveReceiptRuleSetCustomResource", {
onCreate: setActiveReceiptRuleSetSdkCall,
onUpdate: setActiveReceiptRuleSetSdkCall,
logRetention: RetentionDays.ONE_WEEK,
policy: cr.AwsCustomResourcePolicy.fromStatements([
new iam.PolicyStatement({
sid: 'SesCustomResourceSetActiveReceiptRuleSet',
effect: iam.Effect.ALLOW,
actions: ['ses:SetActiveReceiptRuleSet'],
resources: ['*']
}),
]),
});