AWS CDK 이럴 때 어떻게 하는 메모.

21572 단어 AWSCDKtech
(2021/10/29cron의 맞춤법 추가)
최근에 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 트리거 배치 창


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('[email protected]'));
    

    Route 53의 레코드세트 제작 및 추가 레코드(예: 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로 만들지는 않으려고 했지만, 둘 다 적극적으로 사용해야 한다고 생각한다.

    좋은 웹페이지 즐겨찾기