๐ AWS CDK 101๐ธ - lambda & CDK ์๊ณ
AWS CDK๋ฅผ ์ฒ์ ์ ํ ์ด๋ณด์๋ ์ด ์๋ฆฌ์ฆ ์ด์ ์ ๊ธ์ ๊ผญ ์ฝ์ด ์ฃผ์ญ์์ค.
์ด์ ๊ธ์ ๋์น๋ฉด ์๋ ๋งํฌ๋ฅผ ํตํด ์ฐพ์๋ณด์ธ์.
๐ ์๋๐ Dev Post
๐ ์ด์ ๊ฒ์๋ฌผ ์ ๋ฌ๐
์ฐ์ , ์ฐ๋ฆฌ๊ฐ ์ ์งํ๊ธฐ ์ ์, ํ์ฌ์ ์๋ฒ ์์ ์ฅ ์ฐฝ๊ณ ๋ฅผ ์ ๋ฆฌํ๊ณ , ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ์์๋ณด์.์ด๊ฒ์ ์ฐ๋ฆฌ๋ก ํ์ฌ๊ธ ์ ์งํ๊ธฐ ์ ์ ์ด๋ค ๊ฐ๋ ์ ๋ํด ์ ์ดํดํ๊ฒ ํ ๊ฒ์ด๋ค.
๋ถํ์ํ ๋ฆฌ์์ค ์ ๊ฑฐโ
lib/cdk-workshop-stack.ts
์ ์ฝ๋๋ค.SQS ๋๊ธฐ์ด๊ณผ SNS ํ ๋ง, ๊ตฌ๋ ๋ฑ ์ต์ด๋ก ๋ง๋ค์ด์ง ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋จํ๊ฒ ์ค๋ช ํฉ๋๋ค. ์๋์ ๊ฐ์ต๋๋ค.
export class CdkWorkshopStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// const queue = new sqs.Queue(this, 'CdkWorkshopQueue', {
// visibilityTimeout: Duration.seconds(300)
// });
// const topic = new sns.Topic(this, 'CdkWorkshopTopic');
// topic.addSubscription(new subs.SqsSubscription(queue));
}
}
์ฐ๋ฆฌ๊ฐ ์ด๋ฃฌ ์ฑ๊ณผ๋ ์ฐ๋ฆฌ๊ฐ cdk diff
๋ช
๋ น์ ํตํด ์ดํดํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ๋ค.IAM Statement Changes
โโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ Resource โ Effect โ Action โ Principal โ Condition โ
โโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ - โ ${CdkWorkshopQueue50D9D426.Arn} โ Allow โ sqs:SendMessage โ Service:sns.amazonaws.com โ "ArnEquals": { โ
โ โ โ โ โ โ "aws:SourceArn": "${CdkWorkshopTopicD368A42F}" โ
โ โ โ โ โ โ } โ
โโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโดโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)
Resources
[-] AWS::SQS::Queue CdkWorkshopQueue50D9D426 destroy
[-] AWS::SQS::QueuePolicy CdkWorkshopQueuePolicyAF2494A5 destroy
[-] AWS::SNS::Subscription CdkWorkshopQueueCdkWork
[-] AWS::SNS::Topic CdkWorkshopTopicD368A42F destroy
์ฆ, SQS์ SNS๋ฅผ ์ญ์ ํ๋ฉด ์๋ก ์์ฑ๋ ํ ์ ์ฑ
๊ณผ ์ด์ ๊ด๋ จ๋ ์ฃผ์ ๊ตฌ๋
์ด ์ญ์ ๋ฉ๋๋ค.ํ๊ฒฝ ๋ณ๊ฒฝ ์ฌํญ์ ์ ๋ฆฌํ๋ ค๋ฉด
cdk deploy
์ ์คํํ์ญ์์ค.๋จ์ lambda ์คํ๐ญ
์ด์ ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ์ ํ๊ฒฝ์ ์ ๋ฆฌํ๊ณ ๊ธฐ์ด๋ถํฐ ์์ํ์ฌ ๊ฐ๋จํ lambda ์ฐฝ๊ณ ๋ฅผ ๊ตฌ์ถํ๊ณ ์ ํ๋ค. ์ด๊ฒ์ ๊ณต๊ณต ์ค์์น๋ก์ ์ฐ๋ฆฌ๊ฐ ์์ผ๋ก ๊ตฌ์ถํ๋ ๊ณผ์ ์์ ์ ๋ณด๋ฅผ ์ฐ๋ฆฌ์ ํ๊ฒฝ์ ์ ๋ฌํ ๊ฒ์ด๋ค.
import { Construct } from 'constructs';
The AWS CDK is shipped with an extensive library of constructs called the AWS Construct Library. The construct library is divided into modules, one for each AWS service. For example, if you want to define an AWS Lambda function, we will need to use the AWS Lambda construct library.
๊ณ์ํ๊ธฐ ์ ์ ๋ค์ ์์์ ๋ฐ๋ผ ์ ์ฐฝ๊ณ ๋ฅผ ๋ง๋ญ๋๋ค
lib ํด๋์
CommonEventStack.ts
๊ณผ ๊ฐ์ ์ ํ์ผ์ ๋ง๋ญ๋๋ค. ๊ธฐ๋ณธ ํ
ํ๋ฆฟ์ ์ถ๊ฐํ ๊ฒ์
๋๋ค. ์๋์ ๊ฐ์ต๋๋ค.
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CommonEventStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
}
}
๊ทธ๋ฆฌ๊ณ bin\cdk-workshop.ts
์ผ๋ก ๋์๊ฐ์ ์๋ก ๋ง๋ ์ฐฝ๊ณ ๋ฅผ ๊ฐ์ ธ์ค์ญ์์ค.#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import { CdkWorkshopStack } from '../lib/cdk-workshop-stack';
// importing our new stack
import { CommonEventStack } from '../lib/common-event-stack';
const app = new cdk.App();
new CdkWorkshopStack(app, 'CdkWorkshopStack');
// initializing our new stack
new CommonEventStack(app, 'CommonEventStack');
์ด ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก npm run build
์ ์คํํ ๋๊ฐ ๋์๋ค.๋ง์ง๋ง์ผ๋ก, ์ฐ๋ฆฌ๋
cdk ls
์ ์คํํ์ฌ ์๋์ ์ถ๋ ฅ์ ๋ณผ ์ ์๋ค.CdkWorkshopStack
CommonEventStack
๋ง๋ถ์ฌ ๋งํ์๋ฉด, ๋ด๊ฐ ๋ฐฉ๊ธ ์ฐ๋ฆฌ์๊ฒ ์ค ์ ์ฐฝ๊ณ ์์์ ์ ๋์ฌ CommonEvent*
์ ๋ถ์ฌํ๋๋ฐ, ์ฐ๋ฆฌ๋ ๊ณง ๊ทธ๊ฒ์ ์ฐฝ์คํ์ฌ ๊ฐ์ ํ๋ก์ ํธ์ ์ฌ๋ฌ ๊ฐ์ ์ฐฝ๊ณ ๊ฐ ์์ ์ ์์์ ์ฆ๋ช
ํ ๊ฒ์ด๋ค.์ด์ lambda ํจ์๋ฅผ ๋ง๋ค ๋๊ฐ ๋์์ต๋๋ค. ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ์
lambda
์ด๋ผ๋ ํด๋๋ฅผ ๋ง๋ค๊ณ ์ ํ์ผ event-entry.ts
์ ์ถ๊ฐํฉ๋๋ค. ์๋์ ๊ฐ์ต๋๋ค.TypeScript ํ์ผ์์ ์์ํ์ฌ lambda์ ๋ฐฐ์นํ ๋ JavaScript๋ก ์ ์กํด์ผ ํฉ๋๋ค.exports.receiver = async function(event:any) {
console.log("request:", JSON.stringify(event, undefined, 2));
return {
statusCode: 200,
headers: { "Content-Type": "text/plain" },
body: `Message Received: ${event}\n`
};
};
npmbuild์ ์คํํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ๊ฐ์ ํด๋ event-entry.js
์ ์์ฑ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค"use strict";
exports.receiver = async function (event) {
console.log("request:", JSON.stringify(event, undefined, 2));
return {
statusCode: 200,
headers: { "Content-Type": "text/plain" },
body: `Message Received: ${event}\n`
};
};
//# sourceMappingURL*********
์ด ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฐฝ๊ณ CommonEventStack.ts
์ lambda ํจ์๋ฅผ ๊ตฌ์ถํฉ๋๋ค. // A simple lambda Lambda resource definition
const eventEntry = new lambda.Function(this, 'EventEntryHandler', {
runtime: lambda.Runtime.NODEJS_14_X, // execution environment
code: lambda.Code.fromAsset('lambda'), // code loaded from "lambda" directory
handler: 'event-entry.receiver' // file is "event-entry", function is "receiver"
});
}
๋ง์ฝ ๊ทธ๊ฒ์ด ๋ถํํ๋ค๋ฉด, ํ์ํ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์์ง ๋ง์ธ์๐
import * as lambda from 'aws-cdk-lib/aws-lambda'
์ฌ๊ธฐ์ NodeJs 14x๋ฅผ ์ฌ์ฉํ์ฌ ์คํํ ๋, ํ๋ก์ธ์ ํจ์๋ event-entry
์ด๋ผ๋ ํ์ผ์์ ์์ผ๋ฉฐ, ๊ทธ ํจ์ ์ด๋ฆ์ receiver
๊ณผ ์ ์ฌํ๋ค.ํ์ฌ
cdk synth CommonEventStack
์ ์คํํ์ฌyaml ํ
ํ๋ฆฟ์์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฐพ๊ฑฐ๋ cdk diff CommonEventStack
์ ์คํํ์ฌ ๋ ์ฝ์ ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ฐพ์ ์ ์์ต๋๋ค.๋ค์ ๋ก๊ทธ์๋ ์ฐพ์ผ๋ ค๋ ๋ด์ฉ์ด ๋์ด๋์ด ์์ต๋๋ค.
IAM Statement Changes
โโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโ
โ โ Resource โ Effect โ Action โ Principal โ Condition โ
โโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโค
โ + โ ${EventEntryHandler/ServiceRole.Arn} โ Allow โ sts:AssumeRole โ Service:lambda.amazonaws.com โ โ
โโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโดโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโ
IAM Policy Changes
โโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ Resource โ Managed Policy ARN โ
โโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ + โ ${EventEntryHandler/ServiceRole} โ arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole โ
โโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Resources
[+] AWS::IAM::Role EventEntryHandler/ServiceRole EventEntryHandlerServiceRoleF9517B59
[+] AWS::Lambda::Function EventEntryHandler EventEntryHandler0826D724
์ฌ๊ธฐ์ ๋ ๊ฐ์ ์์์ ์ฐฝ์คํ๋ค. IAM:role
๊ณผ Lambda:function
์ด๋ค.๊ธฐ๋ณธ์ ์ผ๋ก, ์ฐ๋ฆฌ๋ lambda ํจ์๋ก ์ ํํ ์คํ์ ๋งก๋ ์๋ก์ด ์ญํ ์ ๋ง๋ค์์ต๋๋ค.cdk deploy CommonEventStack
์ ์คํํ๊ณ ์์ IAM ์ ์ฑ
๋ณ๊ฒฝ ์ฌํญ์ y
๊ณผ ํ์ธํ์ฌ ๋ฐฐํฌํ๊ฒ ์ต๋๋ค.
CommonEventStack: creating CloudFormation changeset...
โ
CommonEventStack
โจ Deployment time: 46.9s
Stack ARN:
arn:aws:cloudformation:ap-south-1:********:stack/CommonEventStack/93688c10-a10a-11ec-b942-0ad3136ae540
โจ Total time: 60.19s
AWS ์ฝ์์ ๊ฒ์ฌ๐
์ด์ AWS ์ฝ์์์ lambda๋ฅผ ํ์ํ์ฌ ๊ธฐ๋ณธ ์์ญ์ ๋ค์ด๊ฐ๋ฉด lambda๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
์ง๊ธ ์ด lambda๋ฅผ ํ ์คํธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.๐
์ด๋ฅผ ์ํด, ์ฐ๋ฆฌ๋ ๋ฐ๋์ ์ํ ํ ์คํธ ์ฌ๊ฑด์ด ์์ด์ผ ํ๋ค. ์๋์ ๊ฐ๋ค.
์์์ ๋ง๋ ๊ฐ์ ํ ์คํธ๋ฅผ ๋ง๋ค๊ณ ์คํํฉ์๋ค.
ํด๋ผ์ฐ๋ ์์น ๋ก๊ทธ์์ ์ด ๋ก๊ทธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
๊ทธ๋ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์๋ก์ด lambda ํจ์๋ฅผ ์คํํ์ฌ ์ฐ๋ฆฌ์ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ๋ณธ๊ณ ์์ ์คํํ ๊ฒ์ ๊ธฐ์ ์ ์๋ฒ์ผ ๋ฟ์ด๊ณ ์ฉ๋ก์ ๋ฐ๋ผ ์์ง์ผ๋ก ์ง์ ํ ์ ์์ผ๋ฉฐ ์ต์ ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๊ฒจ์ง์ง ์๊ณ ๋น๊ฒฐ์ผ ๋ฟ์ด๋ค.
๋ณธ๊ณ ๋ฅผ ์์ฑํ๊ธฐ ์ ์ cdk cli๋ฅผ ํ๋ ๋ ์์๋ณด๋ฉด ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
ํซ ์ค์ ๋ฐฐํฌ๐บ
cdk deploy --hotswap
This command deliberately introduces drift in CloudFormation stacks in order to speed up deployments. For this reason, only use it for development purposes. Never use hotswap for your production deployments!
ํญ๋ชฉ์์ lambda ์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ ๋ณ๊ฒฝํฉ์๋ค
exports.receiver = async function(event:any) {
console.log("request:", JSON.stringify(event, undefined, 2));
return {
statusCode: 200,
headers: { "Content-Type": "text/plain" },
body: `Hotswapped now! \nMessage Received: ${JSON.stringify(event)}\n`
};
};
์ด๊ฒ์ lambda๋ฅผ ์ํ ์์ฐ๋ง ๋ฐํํฉ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ, lambda์์ typescript๋ฅผ ์ฌ์ฉํ๊ณ , ์ด๊ตํ์ ํ๊ธฐ ์ ์ ๊ตฌ์ถํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฝ๋๋ค. ์ด ๊ฒฝ์ฐ, ์ค์ ๋ ๋ฐฐ๋ฌ ๊ฐ๋ฅํ ํ์ผ์ ๋ฐํ๋์ง๋ง, js
ํ์ผ์ ์์ํ ์
๋ฐ์ดํธ๋์ง ์์ต๋๋ค.๋ด json ํจํค์ง์ package.json
์ ์คํฌ๋ฆฝํธ์ฒ๋ผ ์คํํ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค."fast": "npm run build && cdk deploy CommonEventStack --hotswap"
์ด ์๊ฐ์ด ์ค์ด๋ค์์ง๋ง ์ฌ๊ธฐ์ ์ฃผ์ํด์ผ ํ ๊ฒ์ deployment time
์ผ๋ก ๋งค์ฐ ์์ ๊ฐ์ผ๋ก ์ค์๋ค๋ ๊ฒ์ด๋ค.์ด์ ์ ์ ์ฒด ๋ฐฐ์น ์๊ฐ์ 45์ด์๋๋ฐ, ์ง๊ธ์ 2์ด๋ฐ์ ๋์ง ์์ ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋งค์ฐ ์ ์ฉํ๋ค.โจ hotswapping resources:
โจ Lambda Function 'CommonEventStack-EventEntryHandler0826D724-xaVWqcUsxERH'
โจ Lambda Function 'CommonEventStack-EventEntryHandler0826D724-xaVWqcUsxERH' hotswapped!
โ
CommonEventStack
โจ Deployment time: 2.22s
Stack ARN:
arn:aws:cloudformation:ap-south-1:575066707855:stack/CommonEventStack/93688c10-a10a-11ec-b942-0ad3136ae540
โจ Total time: 15.81s
์ฌ๊ธฐ์ ๋๋
drift
์ ์๊ฐํ๋๋ฐ, ๊ทธ ๋ป๊ณผ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ๋ณด์ฌ ์ค๋ค.์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ์ฐฝ๊ณ ๋ ๊ทธ ์๋์ ์์์ ์ ํํ๊ณ ์ถ์ ๋ฐ ์ฌ์ฌ๋ฅผ ์ํด ํ๋ฅ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.ํ๋ฅ ๊ฒ์ธก๐ข
ํ๋ฅ ๊ฒ์ฌ๋ฅผ ํตํด ์ฐฝ๊ณ ์ ์ค์ ์ค์ ์ด ์์ํ ์ค์ ๊ณผ ๋ค๋ฅด๊ฑฐ๋ ํ๋ฅ๋์๋์ง ๊ฒ์ฌํ ์ ์์ต๋๋ค.CloudFormation์ ์ฌ์ฉํ์ฌ ์ ์ฒด ์คํ์ ์ด๋์ด๋ ์คํ์ ๊ฐ๋ณ ๋ฆฌ์์ค์ ์ด๋์ ๊ฐ์งํฉ๋๋ค.
๋ง์ฝ ์์์ ์ค์ ์์ฑ ๊ฐ์ด ์์ํ ์์ฑ ๊ฐ๊ณผ ๋ค๋ฅด๋ฉด ์์์ด ์ด๋ฏธ ์ด๋ํ๋ค๊ณ ์ฌ๊ธด๋ค.์ด๊ฒ์ ์ฌ์ง์ด ์์ฑ์ด๋ ์์์ด ์ญ์ ๋์๋์ง ์ฌ๋ถ๋ฅผ ํฌํจํ๋ค.๋ง์ฝ ์ฐฝ๊ณ ์ ํ ๊ฐ ์ด์์ ์์์ด ์ด๋ํ๋ค๋ฉด, ์ฐฝ๊ณ ๊ฐ ์ด๋ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๋ณธ ์ปดํจํฐ ํด๋ผ์ฐ๋๋ฅผ ์ด์ฉํ์ฌ ๋ฐฐ์น๋ฅผ ํ์ฑํ๋ ๊ฒ์ด ์๋๋ผ ์ด๊ตํ ๋ฐฐ์น๋ฅผ ํตํด ์ด๊ธฐ ์ฐฝ๊ณ ๊ผญ๋๊ธฐ์ ํ๋ฅ ๋ณํ๋ฅผ ์ด์ฉํ์ฌ ๋์ฑ ๊ฐ๋จํ๊ณ ๋น ๋ฅธ ๋ฐฐ์น๋ฅผ ์งํํ๋ค.
์์ ํ๋ฅ ์ํ ์ฝ๋ ๋ฐ ์ค๋ช ๐ฝ
์ด๊ฒ์ ์ต๊ทผ์cloudformation๋ฐฐ์น์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๊ต๋๋ค.
์์์ ์ญ์ ๋์๊ธฐ ๋๋ฌธ์ ์์ํ ํ ํ๋ฆฟ ์ค์ ๊ณผ ๋ค๋ฅด๋ค.
์์์ ์์ํ ํ ํ๋ฆฟ ์ค์ ๊ณผ ๋ค๋ฅด๋ค.
CloudFormation์์ ๋ฆฌ์์ค๊ฐ ์์ํ ํ ํ๋ฆฟ ๊ตฌ์ฑ๊ณผ ๋ค๋ฅธ์ง ํ์ธํ์ง ์์์ต๋๋ค.
๋ฆฌ์์ค์ ํ์ฌ ๊ตฌ์ฑ์ด ์ํ๋ ํ ํ๋ฆฟ ๊ตฌ์ฑ๊ณผ ์ผ์นํฉ๋๋ค.
CDK ์๊ณ๐ช
CDK watch๋ ํ์ผ ๋ณ๊ฒฝ์ ๋ชจ๋ํฐ๋งํ๊ณ ํ์ํ ๋ CDK deploy๋ฅผ ํธ์ถํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.๊ทธ๊ฒ์
cdk.json
ํ์ผ์ ๋ชฉ๋ก์ ์ง์ ๋ ํ์ผ์ ํฌํจํ๊ณ ๋ฐฐ์ ํ๋ ๊ฒ์ ๊ฐ์ํ๋ค.
{
"watch": {
"include": [
"**"
],
"exclude": [
"README.md",
"cdk*.json",
"**/*.d.ts",
"lambda/*.ts",
"tsconfig.json",
"package*.json",
"yarn.lock",
"node_modules",
"test"
]
},
}
์์ ๋ถ๋ถ์์ ๋๋ ํน๋ณํ **/*.js
์ lambda/*.ts
์ผ๋ก ๊ฐฑ์ ํ์๋ค.์ด ๋ณ๊ฒฝ์ lambda ์๋ณธ์ ๊ฒ์ถํ๋ ๋์์ ts
ํ์ผ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒ์ถํ ์ ์๋๋ก ํ๊ธฐ ์ํด์์
๋๋ค.tsc
์์ ๋ณด๋ธ js ํ์ผ์
๋๋ค.๋ฐ๋ผ์ ๋๋
tsc -w
๊ณผ cdk watch CommonEventStack --hotswap
์ ์คํํ๊ธฐ ์ํด ๋ ๊ฐ์ ์๋์ฐ์ฆ๋ฅผ ์์ํ ๊ฒ์ด๋ค.๋ณํ ์์
์expect lambda ์ฝ๋ ๋ณ๊ฒฝ์ ์๋์ผ๋ก ๋ฐฐ์นํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๋ฐ์์ ์ฐํธ์ ์ธ ๋ง์ถคํ์
๋๋ค.
tsc -w
this rewrites the js files.
[4:26:07 PM] File change detected. Starting incremental compilation...
[4:26:11 PM] Found 0 errors. Watching for file changes.
cdk watch CommonEventStack --hotswap
published my js files automatically and swiftly.
Detected change to 'lambda/event-entry.js' (type: change). Triggering 'cdk deploy'
โจ Synthesis time: 21.92s
โจ hotswapping resources:
โจ Lambda Function 'CommonEventStack-EventEntryHandler0826D724-xaVWqcUsxERH'
โจ Lambda Function 'CommonEventStack-EventEntryHandler0826D724-xaVWqcUsxERH' hotswapped!
โ
CommonEventStack
โจ Deployment time: 2.17s
Stack ARN:
arn:aws:cloudformation:ap-south-1:575066707855:stack/CommonEventStack/93688c10-a10a-11ec-b942-0ad3136ae540
current credentials could not be used to assume 'arn:aws:iam::575066707855:role/cdk-hnb659fds-lookup-role-575066707855-ap-south-1', but are for the right account. Proceeding anyway.
(To get rid of this warning, please upgrade to bootstrap version >= 8)
โจ Total time: 24.09s
์ด lambda์ ๋ ๋ง์ ์ฐ๊ฒฐ์ ์ถ๊ฐํ๊ณ ๋ค์ ๊ธ์์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.โญ ์ฐ๋ฆฌ์ ๋ค์ ๊ธ์ ์๋ฒless์ ๋ฐํ๋ ๊ฒ์ด๋, ๋ฐ๋์ ๋ณด์ญ์์ค
์ง์งํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!๐
โ Buy Me a Coffee์ ๊ฐ์ ํ๊ณ ์ถ๋ค๋ฉด ๋คํ์ ๋๋ค. ์ ๋ ธ๋ ฅ์ ๋๊ธฐ ์ํด ์๋์ ์ด๊ฑฐํ ๋น์ ์ด ์ ํํ ํ๋ซํผ์์ ์ ๋๊ธ์ ์ฃผ๋ชฉํ ์ ์์ต๋๋ค.
๐ ์๋๐ Dev Post
๐ ์ ์ฌํ๋ค๐
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ AWS CDK 101๐ธ - lambda & CDK ์๊ณ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/aravindvcyber/aws-cdk-101-lambda-cdk-watch-le9ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค