Open12

CDK で SES Email Receiving 設定を管理したい

snakasnaka

背景

AWS コンソールから作成された SES の email 受信設定が存在するので、それを CDK で管理する方法に移行したい。

email 受信ルールとして、S3 に保存した後 Lambda 関数を呼び出すようになっている。
その Lambda 関数も CDK で管理する。

snakasnaka
snakasnaka

既存の Rule Set を CDK で参照して、Rule の更新などができそうなことは判明したが、 Rule Set 全体を CDK で作り直すほうが良さそう。

snakasnaka
snakasnaka

SSM Parameter Store の参照権限を Lambda に付与する

StringParemeter.fromSecureStringParameterAttributes()

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ssm.StringParameter.html#static-fromwbrsecurewbrstringwbrparameterwbrattributesscope-id-attrs

    // SSM Parameter Store を参照
    const fooParams = ssm.StringParameter.fromSecureStringParameterAttributes(this, 'FooBar', {
      parameterName: `/foo/bar`
    });
    // Lambda に参照権限を付与する (lambdaFunction は cdk.aws_lambda.Function)
    fooParams.grantRead(lambdaFunction);
snakasnaka

CDK で作成した Rule Set を Active にしたい

今のところ Rule Set を Active にする方法が CloudFormation に用意されいないらしいので、CDK でも対応していないらしいが、 Custom Resource を利用することで回避できる。

https://github.com/aws/aws-cdk/issues/28823#issuecomment-2051484866

上記からコードを引用:

    // 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: ['*']
        }),
      ]),
    });