0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

この記事誰得? 私しか得しないニッチな技術で記事投稿!

AWS CDK Ver.2 PythonでSESのメール送信Logを記録する構成を作成してみた

Posted at

SESでメールを送信した際のLogを記録する構成をAWS CDKで作ってみました。今回は費用的な観点でS3に格納するような構成としています。

全コードはGithubを参照してください。
Githubはここ

image.png

前提条件

  • AWS CDK v.2 がインストールされていること
  • Python 3.x がインストールされていること
  • AWSアカウントがあり、AWS CLIが設定されていること

※Cloud9を使うとこの辺りがPassできるため、Cloud9を使って今回の記事の内容は作成しています。

構築手順

1. CDKアプリの初期化

先ずはCDKアプリの初期化を行います。

$ mkdir cdk-ses-log
$ cd cdk-ses-log
$ cdk init --language python

2.必要なパッケージをインストール

続いて必要パッケージのインストールになります。
ここでは、CDKアプリを初期化した際に作成された.venvを有効化しています。

$ source .venv/bin/activate
$ pip install -r requirements.txt

3. スタックの記述

from aws_cdk import (
    Stack,
    aws_s3 as s3,
    aws_ses as ses,
    aws_iam as iam,
    aws_kinesisfirehose as firehose,
)
from constructs import Construct

class CdkSesLogStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        region = 'ap-northeast-1'
        account_id = '**********'
        
        # SESのメール送信Logを格納するS3 Bucket
        bucket = s3.Bucket(self, 'SesLogsBucket')
        
        # Firehose用のIAM Roleを作成
        firehose_role = iam.Role(
            self,
            'FirehoseDeliveryRole',
            assumed_by=iam.ServicePrincipal("firehose.amazonaws.com")
        )
        firehose_role.add_to_policy(
            iam.PolicyStatement(
                actions=[
                    's3:PutObject',
                    's3:GetBucketLocation',
                ],
                resources=[
                    bucket.bucket_arn,
                    f'{bucket.bucket_arn}/*'
                ],
            )
        )
        firehose_role.add_to_policy(
            iam.PolicyStatement(
                actions=[
                    'logs:PutLogEvents',
                ],
                resources=[
                    f'arn:aws:logs:{region}:{account_id}:log-group:/aws/kinesisfirehose/*',
                ],
            )
        )
        
        # Firehose delivery stream
        delivery_stream = firehose.CfnDeliveryStream(
            self,
            'SesLogsDeliveryStream',
            s3_destination_configuration={
                'bucketArn': bucket.bucket_arn,
                'roleArn': firehose_role.role_arn
            }
        )
        
        # SES用のIAM Roleを作成
        ses_role = iam.Role(
            self,
            'SesRole',
            assumed_by=iam.ServicePrincipal("ses.amazonaws.com")
        )
        firehose_statement = iam.PolicyStatement(
            actions=[
                'firehose:PutRecordBatch',
                'firehose:PutRecord',
            ],
            resources=[
                delivery_stream.attr_arn
            ],
        )
        ses_policy = iam.Policy(
            self, 
            'SesPolicy', 
            policy_name='ses-policy',
            statements=[firehose_statement],
        )
        ses_role.attach_inline_policy(ses_policy)
        
        # LogをFirehoseに送るためのConfiguration setを作成する
        configuration_set = ses.CfnConfigurationSet(
            self,
            'SesLoggingConfigurationSet',
            name ='ses-logging',
        )
        event_destination = ses.CfnConfigurationSetEventDestination(
            self,
            'SesLoggingConfigurationSetEventDestination',
            configuration_set_name=configuration_set.name,
            event_destination=ses.CfnConfigurationSetEventDestination.EventDestinationProperty(
                matching_event_types=['send'],
                enabled=True,
                kinesis_firehose_destination=ses.CfnConfigurationSetEventDestination.KinesisFirehoseDestinationProperty(
                    delivery_stream_arn=delivery_stream.attr_arn,
                    iam_role_arn=ses_role.role_arn,
                )
            )
        )
        
        # 依存関係を追加
        # 依存関係を挿入しない場合、IAM PolicyとConfigurationSetEventDestination間でエラーが発生
        configuration_set.add_dependency(delivery_stream)
        event_destination.add_dependency(ses_policy.node.default_child)

4. CDKのデプロイ

cdk deploy

デプロイが完了すると、SESのメール送信Logを記録する構成は構築できますが、IDに対してデフォルトととして登録はされません。
特定のSES IDに対してDefault Configuration Setを設定するために、AWS CLIを利用します。(調べましたが、CDKで設定する方法が見つかりませんでした)

aws sesv2 put-email-identity-configuration-set-attributes --email-identity <EmailIdentity> --configuration-set-name <ConfigurationSetName>

以上で構築完了です。

まとめ

この記事では、SESのメール送信LogをS3に格納する構成を構築する方法を紹介しました。
どなたかの参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?