🛠️

AWS CDKでこういうときどうするの備忘録

2021/10/15に公開

(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