🛠️
AWS CDKでこういうときどうするの備忘録
(2021/10/29 cronの書き方追加)
最近AWS CDK使いはじめた人です。
AWSLambdaのDeployとかは、Serverless Frameworkを使っていたんですが、ちょっと勉強兼ねて案件でAWS CDKを使ってみようかなと思いまして、Workshopやって、コードで環境構築できるの便利やんと今更ながら思っている人です。
ここからは、自分の備忘録兼ねて、こういうときどうするのを書きます。
なお、ドキュメントに書いてある内容も含まれます。
Lambda絡み
S3トリガー
const lambda = new NodejsFunction(this, `index`, {
runtime: lambda.Runtime.NODEJS_14_X,
entry: 'lambda/index.ts',
handler: 'indexHandler',
});
const bucket = new s3.Bucket(this, `bucket`);
lambda.addEventSource(new S3EventSource(bucket, {
events: [
s3.EventType.OBJECT_CREATED
],
filters: [
{
prefix: 'ses/'
}
]
}));
SQSトリガー with バッチウィンドウ
const lambda = new NodejsFunction(this, `index`, {
runtime: lambda.Runtime.NODEJS_14_X,
entry: 'lambda/index.ts',
handler: 'indexHandler',
});
const queue = new sqs.Queue(this, `queue`, {
queueName: `queue`,
});
lambda.addEventSource(new SqsEventSource(queue, {
batchSize: 10,
maxBatchingWindow: Duration.minutes(5)
}));
EventBridge起動
- rate(1時間おきに起動)
const lambda = new NodejsFunction(this, `index`, {
runtime: lambda.Runtime.NODEJS_14_X,
entry: 'lambda/index.ts',
handler: 'incexHandler',
});
const lambdaTarget = new LambdaFunction(
lambda,
{
retryAttempts: 0
}
);
new Rule(this, 'EventRole', {
schedule: Schedule.rate(Duration.hours(1)),
targets: [lambdaTarget]
});
- cron (毎時00分に実行)
const lambda = new NodejsFunction(this, `index`, {
runtime: lambda.Runtime.NODEJS_14_X,
entry: 'lambda/index.ts',
handler: 'incexHandler',
});
const lambdaTarget = new LambdaFunction(
lambda,
{
retryAttempts: 0
}
);
new Rule(this, 'SendRetryMailEventRole', {
schedule: Schedule.cron({
minute: '0',
hour: '0/1'
}),
targets: [lambdaTarget]
});
カスタムポリシーつける(例はSESでメール送信)
const lambda = new NodejsFunction(this, `index`, {
runtime: lambda.Runtime.NODEJS_14_X,
entry: 'lambda/index.ts',
handler: 'incexHandler',
});
const sendMailPolicyStatement = new iam.PolicyStatement(
{
effect: iam.Effect.ALLOW,
resources: [
'*'
],
actions: [
'ses:SendRawEmail',
'ses:SendEmail',
]
}
);
lambda.addToRolePolicy(sendMailPolicyStatement);
その他
SNS TopicおよびSubscription(例はEmail)
const topic = new sns.Topic(this, 'topic', {
displayName: 'Mail Topic'
})
topic.addSubscription(new subs.EmailSubscription('hogehoge@example.com'));
Route53のレコードセット作成およびレコード追加(例はMXレコード追加)
const hostZone = new route53.PublicHostedZone(this, 'HostedZone', {
zoneName: 'example.com',
});
new route53.MxRecord(this, 'mxRecord', {
zone: hostZone,
recordName: 'example.com',
values: [
{
hostName: 'inbound-smtp.us-east-1.amazonaws.com',
priority: 10
}
],
});
DynamoDBテーブル追加およびGSI追加
const table = new dynamodb.Table(this, 'table', {
partitionKey: { name: 'key', type: dynamodb.AttributeType.STRING }
});
table.addGlobalSecondaryIndex({
indexName: 'index',
partitionKey: { name: 'gsikey', type: dynamodb.AttributeType.STRING }
});
適宜追加します。
いや、コードで結構書けるし、え、こんなことまでできちゃうの?ってのもあって、凄いなと今更ながらにびっくりしております。
ただ、バージョンアップ速すぎますね。バージョン揃えないと動き怪しくなるし(数時間それではまってたことあり)。
とはいえ、それを差し引いても、凄いですわ(さっきから同じことしか言ってない)
今までServerless Frameworkで作ってたものを全部CDKにするとかはしない予定ですが、まあ両方とも積極的に使って行こうかなと思います。
Discussion