๐ก AWS CDK 101โ๏ธ - API ๊ฒ์ดํธ์จ์ด ๊ตฌ์กฐ ์ฌ์ฉ, ์ ํ, ํ ๋น๋, ์ฌ์ฉ ๊ณํ, API ํค
์ด์ ๊ธ์ ๋์น๋ฉด ์๋ ๋งํฌ๋ฅผ ํตํด ์ฐพ์๋ณด์ธ์.
๐ ์๋๐ Dev Post
๐ ์ด์ ๊ฒ์๋ฌผ ์ ๋ฌ๐
๋ณธ๋ฌธ์์, ์์์ ์ด๊ฑฐํ ์ด์ ๊ธ์์ ๋ง๋ ๊ธฐ๋ณธ lambda ํจ์ ์์์ API ์ธํฐํ์ด์ค๋ฅผ ์๊ฐํฉ๋๋ค.
์๋ฃจ์ ์ API ๊ฒ์ดํธ์จ์ด๋ฅผ ์ฌ์ฉํ๋ ์ด์ โ
lambda๋awsํ๊ฒฝ์์๋ง ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ API ์ธํฐํ์ด์ค ์ค์ ์ด ํ์ํฉ๋๋ค. ์ด๊ฒ์ ๊ณต๊ณต HTTP ๋ ธ๋๋ฅผ ๊ณต๊ฐํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ธํฐ๋ท์์ ๋ชจ๋ ์ฌ๋์ด HTTP ํด๋ผ์ด์ธํธ๋ฅผ ํตํด ์ด ๋ ธ๋์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ํ ์ธ์ฆ ๊ฒ์ฌ๊ฐ ์คํจํ ๊ฒฝ์ฐ API ๊ฒ์ดํธ์จ์ด๋ ๋ฐฑ์๋ Lambda ํจ์๋ฅผ ํธ์ถํ์ง ์๊ณ ๋ ์๋ชป๋ ์์ฒญ์ ์ฐจ๋จํ ์ ์์ต๋๋ค.API ๊ฒ์ดํธ์จ์ด๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋น์ผ ๋๋ฐ๋ค ํธ์ถ ๋น์ฉ์ ์ ๊ฐํ๊ณ ํ์์ ๋ฐ๋ผ ๋๋ฐ๋ค ํจ์์์ ์์ฒญ ๊ฒ์ฆ์ ๋ง์ดํธ ํด์ ํ ์ ์๋ค.
ํธ์ง
lib/common-event-stact.ts
๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค.๋ชจ๋์ aws-cdk-lib/aws-apigateway
์์ agigw
๋ก ๊ฐ์ ธ์ต๋๋ค. // this defines an new API Gateway REST API resource backed by our "eventEntry" function.
const eventGateway = new apigw.LambdaRestApi(this, 'EventEndpoint', {
handler: eventEntry
});
cdk diff
๋ฅผ ์คํํ ๋ ์ ์์์ ์ ์ฌํ ๋ก๊ทธ์ ๊ด๋ จ๋ IAM ์ ์ฑ
๋ณ๊ฒฝ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.IAM Statement Changes
โโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ Resource โ Effect โ Action โ Principal โ Condition โ
โโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ + โ ${EventEndpoint/CloudWatchRole.Arn} โ Allow โ sts:AssumeRole โ Service:apigateway.amazonaws.com โ โ
โโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ + โ ${EventEntryHandler.Arn} โ Allow โ lambda:InvokeFunction โ Service:apigateway.amazonaws.com โ "ArnLike": { โ
โ โ โ โ โ โ "AWS:SourceArn": "arn:${AWS::Partition}:execute-a โ
โ โ โ โ โ โ pi:${AWS::Region}:${AWS::AccountId}:${EventEndpoint โ
โ โ โ โ โ โ 82CBF40A}/${EventEndpoint/DeploymentStage.prod}/*/* โ
โ โ โ โ โ โ " โ
โ โ โ โ โ โ } โ
โ + โ ${EventEntryHandler.Arn} โ Allow โ lambda:InvokeFunction โ Service:apigateway.amazonaws.com โ "ArnLike": { โ
โ โ โ โ โ โ "AWS:SourceArn": "arn:${AWS::Partition}:execute-a โ
โ โ โ โ โ โ pi:${AWS::Region}:${AWS::AccountId}:${EventEndpoint โ
โ โ โ โ โ โ 82CBF40A}/test-invoke-stage/*/*" โ
โ โ โ โ โ โ } โ
โ + โ ${EventEntryHandler.Arn} โ Allow โ lambda:InvokeFunction โ Service:apigateway.amazonaws.com โ "ArnLike": { โ
โ โ โ โ โ โ "AWS:SourceArn": "arn:${AWS::Partition}:execute-a โ
โ โ โ โ โ โ pi:${AWS::Region}:${AWS::AccountId}:${EventEndpoint โ
โ โ โ โ โ โ 82CBF40A}/${EventEndpoint/DeploymentStage.prod}/*/" โ
โ โ โ โ โ โ } โ
โ + โ ${EventEntryHandler.Arn} โ Allow โ lambda:InvokeFunction โ Service:apigateway.amazonaws.com โ "ArnLike": { โ
โ โ โ โ โ โ "AWS:SourceArn": "arn:${AWS::Partition}:execute-a โ
โ โ โ โ โ โ pi:${AWS::Region}:${AWS::AccountId}:${EventEndpoint โ
โ โ โ โ โ โ 82CBF40A}/test-invoke-stage/*/" โ
โ โ โ โ โ โ } โ
โโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
IAM Policy Changes
โโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ Resource โ Managed Policy ARN โ
โโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ + โ ${EventEndpoint/CloudWatchRole} โ arn:${AWS::Partition}:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs โ
โโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)
Resources
[+] AWS::ApiGateway::RestApi EventEndpoint EventEndpoint82CBF40A
[+] AWS::IAM::Role EventEndpoint/CloudWatchRole EventEndpointCloudWatchRole4E252113
[+] AWS::ApiGateway::Account EventEndpoint/Account EventEndpointAccount1A8CF478
[+] AWS::ApiGateway::Deployment EventEndpoint/Deployment EventEndpointDeployment9E6BA6B96f1395a2ccbaf49542e68813f77a19e7
[+] AWS::ApiGateway::Stage EventEndpoint/DeploymentStage.prod EventEndpointDeploymentStageprod2ED092D9
[+] AWS::ApiGateway::Resource EventEndpoint/Default/{proxy+} EventEndpointproxyCBF9AFD2
[+] AWS::Lambda::Permission EventEndpoint/Default/{proxy+}/ANY/ApiPermission.CommonEventStackEventEndpointB06FCC50.ANY..{proxy+} EventEndpointproxyANYApiPermissionCommonEventStackEventEndpointB06FCC50ANYproxy3F9D95E2
[+] AWS::Lambda::Permission EventEndpoint/Default/{proxy+}/ANY/ApiPermission.Test.CommonEventStackEventEndpointB06FCC50.ANY..{proxy+} EventEndpointproxyANYApiPermissionTestCommonEventStackEventEndpointB06FCC50ANYproxy75C60637
[+] AWS::ApiGateway::Method EventEndpoint/Default/{proxy+}/ANY EventEndpointproxyANY74421EDC
[+] AWS::Lambda::Permission EventEndpoint/Default/ANY/ApiPermission.CommonEventStackEventEndpointB06FCC50.ANY.. EventEndpointANYApiPermissionCommonEventStackEventEndpointB06FCC50ANY7F8C8232
[+] AWS::Lambda::Permission EventEndpoint/Default/ANY/ApiPermission.Test.CommonEventStackEventEndpointB06FCC50.ANY.. EventEndpointANYApiPermissionTestCommonEventStackEventEndpointB06FCC50ANYC6DC815A
[+] AWS::ApiGateway::Method EventEndpoint/Default/ANY EventEndpointANY8620E9D3
์์ ํ ์ฑ๊ณผ๋ฅผ ์ด๊ฒฐํ๋ค.๐ฅ
์ด์์ ๋ด์ฉ์ ์ด๊ดํ๊ธฐ ์ํด ๋ฐฑ์๋์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ๋ค์๊ณผ ๊ฐ์ด ์์๋ณด๊ณ ๋ฐํํ ๊ฒ์ ๋๋ค.
CloudWatchRole
์ ๋ง๋ค๊ณ ์ด ์ ์ฑ
์ด ๋ก๊ทธ๋ฅผapigateway์์cloudwatch๋ก ์ ์กํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.prod
๋ ์ด๋ฏธ ์ค์น๋์ด ์์ผ๋ฉฐ, ์ฐ๋ฆฌ๋ ์ ํ ๋จ๊ณ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ฌ๋ฌ ๋จ๊ณ์์ ๊ณผ๋ํ ํน์ฑ ํ
์คํธ๋ฅผ ์งํํ ์ ์๋ค.Resource
๊ฒฝ๋ก์ ํ์ํ ๊ถํ์ ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ดrestapi์ ์ ์ ๋
ธ๋์ ํ
์คํธ ๋
ธ๋๋ ํ์ ์์ ๊ฒฝ๋ก{proxy+}
๋ฅผ ์ค์ ํฉ๋๋ค.method
์ ํ์ํ ๊ถํ์ผ๋ก ์ค์ ๋ฉ๋๋ค.์ง๊ธ ์ด ๋ฐฐ์น๋ฅผ ์งํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฌํฉ์๋ค.
๊ทธ ์ ์, ์ ์ ํ ์ ๋ณด๋ฅผ ํ์ํ๊ธฐ ์ํด lambda์์ ๋ค์ ํ ๋ฒ ๋ณ๊ฒฝ์ ํ๊ฒ ์ต๋๋ค.
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 in lambda: ${JSON.stringify(event.body)}\n`
};
};
cdk deploy CommonEventStack
โ
CommonEventStack
โจ Deployment time: 57.21s
Outputs:
CommonEventStack.EventEndpointA893C53E = https://lwo***********uvhg.execute-api.ap-south-1.amazonaws.com/prod/
Stack ARN:
arn:aws:cloudformation:ap-south-1:575066707855:stack/CommonEventStack/93688c10-a10a-11ec-b942-0ad3136ae540
โจ Total time: 68.43s
๐ ๊ถ๊ณก์ํ
์ฐ๋ฆฌ๊ฐ ์ด ์ ์ง ๋จ์ ์ ๊ฒ์ฌํ๊ธฐ ์ํด ๊ถ๊ณก์ ๋ง๋ค ๋, ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ์ป์๋์ง ๋ด ์๋ค.
curl https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/prod/
Message Received: null
์ฌ๊ธฐ์, ์ฐ๋ฆฌ๋ ์ฑ๊ณต์ ์ผ๋ก lambda์ ๋ฉ์์ง๋ฅผ ๋ณด๋๊ณ , ์ถ๋ ฅ์ ์ป์๋ค.๋น๋ก ์ฐ๋ฆฌ๋ null
์ด ์์ง๋ง, ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ ์ต์ด์ GET
์์ฒญ์์ ์ด๋ค ์์ฒด๋ ๋ณด๋ด์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.ํ์ฌpost ์์ฒญ์์ ์์ฒญ ์ฃผ์ฒด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค.
curl -H "Content-Type: application/json" -d '{ "message": "client message"}' -X POST https://********.execute-api.ap-south-1.amazonaws.com/prod/
Message Received in lambda: "{ \"message\": \"client message\"}"
์ฐ๋ฆฌ๋ ์ด๋ฏธagi ์ค์์น๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ ์ปจํธ๋กค๋ฌ์์ ๊ทธ๊ฒ์ ๊ฒ์ฌํ๊ณ aws ์ปจํธ๋กค๋ฌ์์ ๊ทธ๊ฒ์ ํ
์คํธํ ์ ์์ต๋๋ค.AWS ์ฝ์์ API ๊ฒ์ดํธ์จ์ดโก
๋จ์ ๊ฒฝ๋ก์ ํ์ฉ ๋ฐฉ๋ฒ ๊ฒ์ฌโก
๋ฉ์์ง ํ ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ POST ์์ฒญ ํธ์ถโก
์์์ ์์ฑํ Api ๊ฒ์ดํธ์จ์ด ์ต์ ํโก
POST ๋ฐฉ๋ฒ๊ณผ ํน์ ํ ์์ ๊ฒฝ๋ก์๋ง ์ฌ์ฉํ ์ ์๋๋กapi ์ธํฐํ์ด์ค๋ฅผ ์ต์ ํํฉ๋๋ค.
CDK API ์ฐธ์กฐ ๋ฌธ์๐ผ
๊ทธ ์ ์ cdkapi ์ฐธ๊ณ ๋ฌธ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ฐธ๊ณ ๋ฌธ์๋ฅผ ์ฐ๊ตฌํ์ฌ ๋ชจ๋ cdk ์ฐฝ๊ณ ์์ ๊ตฌ์กฐ์ ํ์ํ ๋งค๊ฐ ๋ณ์์ ์ต์ ์ ์ ํํ ์ ์๋ค.
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ ธ์จ ๊ฒ์ ๊ธฐ์ตํ๋ค๋ฉด
aws-cdk-lib/aws-apigateway
์ฐ๋ฆฌ๋ https://docs.aws.amazon.com/cdk/api/v2
์ ๊ตฌ์กฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐ์์ผ ํ๋ค๊ตฌ์ฒด์ ์ผ๋ก ๋งํ๋ฉด, ์ฐ๋ฆฌ๋ ๋ฐ๋์ ๋ด๋น๊ฒ์ด์ ์ ํด์ผ ํ๋ค
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway-readme.html
.์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ apigateway ๊ตฌ์กฐ์ ํ์ํ ๋ฌธ์์ ๊ทธ ์์ฑ๊ณผ ๋ฐฉ๋ฒ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ ๋นํ ์์๋ฅผ ์ ๊ณตํ ์ ์๋ค.์ฌ๋ฐ๋ฅธ ์์ ๊ฒฝ๋ก ๋ฐ ๋ฐฉ๋ฒ ์ง์ ๐ฆ
์ฐ์ , ์ด ํ์์ค๋ฌ์ด ์์ด์ ํธ ์์ ๊ฒฝ๋ก ์ ์๋ฅผ ์ญ์ ํฉ์๋ค.
const eventGateway = new apigw.LambdaRestApi(this, 'EventEndpoint', {
handler: eventEntry,
proxy: false
});
์ฌ๊ธฐ์์ ํ๋ก์ ์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์์ค๋ฌ์ด ์์ ๊ฒฝ๋ก ์ ์๋ฅผ ์ญ์ ํฉ๋๋ค.๋ค์ ์์์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ ์์ ๊ฒฝ๋ก๋ฅผ ์ค๋ช ํฉ๋๋ค.
const eventHandler: apigw.LambdaIntegration = new apigw.LambdaIntegration(eventEntry);
const event = eventGateway.root.addResource('event');
const eventMethod: apigw.Method = event.addMethod('POST', eventHandler, {
apiKeyRequired: false
});
ํ์ฌ ์ฐ๋ฆฌ๋ ํน์ ํ ์์ ๊ฒฝ๋ก์ ๋ฐฉ๋ฒ์ ์ฑ๊ณต์ ์ผ๋ก ๊ณต๊ฐํ๊ณ ํ์ฉํ ๋ฟ์ด๋ค.
๊ธ์ง๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ธฐ๋ณธ ์์ ๊ฒฝ๋ก์ ์ ๊ทผํ ๋๐ฆ
ํน์ api์ ์ฑ๊ณต์ ์ผ๋ก ์ ๊ทผํ ์ ์์ง๋ง
full path
ํ์ฉ๋ ๋ฐฉ๋ฒ๊ณผ ์ฐจ์ด์ ์ ์ฃผ์ํ์ญ์์ค.๊ณํ ๋ฐ API ํค ์ฌ์ฉ๐
A usage plan specifies who can access one or more deployed API stages and methods, and the rate at which they can be accessed.
์ด ํ๋ก๊ทธ๋จ์ API ํค๋ฅผ ์ฌ์ฉํ์ฌ API ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๊ณ ํด๋น API ๋จ๊ณ์ ๋ํ ๊ฐ ํค์ ์ก์ธ์ค๋ฅผ ์ ์ ํ๊ฒ ์ธก์ ํฉ๋๋ค.๋ํ ์ค์ผ์ค์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ณ ํด๋ผ์ด์ธํธ API ํค์ ๋ํด ๊ฐ์ ๋ก ์ํ๋๋ ์ค๋กํ ์ ํ ๋ฐ ํ ๋น๋ ์ ํ๋ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๋ค์ ์์ ์์๋ ์ฌ์ฉ ๊ณํ ๋ฐ API ํค๋ฅผ ์์ฑํ๊ณ ์ฐ๊ด์ํค๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ์ค๋๋ค.
const eventMethod: apigw.Method = event.addMethod('POST', eventHandler, {
apiKeyRequired: true,
});
In order to use a api key it is required to setup an usage plan, something similar to the below example and then we can associate that to the key we just created.
const plan = eventGateway.addUsagePlan('UsagePlan', {
name: 'Workshop',
description: 'For Workshop',
throttle: {
burstLimit: 5,
rateLimit: 10,
},
quota: {
limit: 100,
period: apigw.Period.DAY
}
});
const normalUserKey = eventGateway.addApiKey('ApiKey',{
apiKeyName: 'av-api-key',
value: 'av-api-key-value-********',
});
plan.addApiKey(normalUserKey);
๋ฐฐํฌ ๋จ๊ณ๋ณ ๋ฏธ์ธ ์กฐ์ ์ฌ์ฉ ๊ณํ๐ป
ํน์ ๋ฐฉ๋ฒ์ ์๋ก ๋ค๋ฅธ ๋ฐฐ์น ๋จ๊ณ์์ ์์ ํ ์ฌ์ฉ ๊ณํ์ ๋ฏธ์ธํ๊ฒ ์กฐ์ ํ๋ค. ๋ํ ๋ฐฉ๋ฒ ๋จ๊ณ์ ์ ์ฝ ์ ํ์ ํฌํจํ์ฌapi ์๋ชจ ์ ํ์ ๋์ฑ ์ ํต์ ํ๊ณ ๊ณ์ฝ์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ณ ๊ฐ์ ์์ ์ด์ฉ๋ฅ ์ ๋์ผ ์ ์๋ค.
plan.addApiStage({
stage: eventGateway.deploymentStage,
throttle: [
{
method: eventMethod,
throttle: {
rateLimit: 3,
burstLimit: 2
}
}
]
});
์๋์ ๋๋ฐ ์ ํ์ ์ฌ์ฉํ์ฌapi๋ฅผ ์ ํํฉ๋๋ค๐
๊ฒ์ดํธ์จ์ด๊ฐ ์ ๊ตฌ ์์ฒด์ ์ถ๊ฐ ์์ฒญ์ ๊ฑฐ๋ถํ๊ธฐ ์ ์, ๋น์ ์ ์๋ ์ ํ์ ํตํด ์ด๋น ํธ์ถ ํ์์ ์๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ์ดํ ์ ์์ต๋๋ค.
throttle: {
rateLimit: 3,
burstLimit: 2
}
ํ ๋น๋ ์ ํ๐ก
ํ ๋น์ก ์ ํ์api์ธํฐํ์ด์ค๊ฐ ์ธํฐํ์ด์ค ์ ํ์ ์ด๊ณผํ๊ธฐ ์ ์ ๋ฐ์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋์ ์๋์ ์ ์ํ๋ ๋ฐ ๋์์ด ๋๋ค.
๋ณดํตaws๋ ๊ฐ ์ง์ญ์ ๋ชจ๋ ์๋น์ค์ ์ผ์ ํ ๊ณ ์ ํ ๋น์ก์ ์ ๊ณตํ๋๋ฐ ์ด๊ฒ์ ์์์ ๋ฐ๋ผ ๋ชจ๋ ์ฌ์ฉ ๊ณํ์ ์ผ๋ถ๋ถ์ ๋ณด์กดํจ์ผ๋ก์จ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.์ธ๋ถ ์ฌ์ฉ์api์ ์ฌ์ฉ์ ์ ํํ๊ธฐ ์ํด ์ธ๋ถ ์ฌ์ฉ์์ ์๋น์ค ์ธต์ ๋ฐ๋ผ ๊ฒ์ฌํ ์ ์์ต๋๋ค.
quota: {
limit: 5,
period: apigw.Period.DAY
}
api ํค ์ฌ์ฉ์์๊ฒ ํ ๋น๋ ํ ๋น๋์ ์ด๊ณผํ๋ฉด ์ค๋ฅ ์๋ต์ ๋ณด๋
๋๋ค.์๋ ์ ํ API ํค๐
๋จ์ผapi ํค๋ฅผ ๋ง๋ค๊ณ ์๋ ์ ํ์ ์ค์ ํด์ผ ํ๋ ๊ฒฝ์ฐ
RateLimitedApiKey
์ฌ์ฉํ ์ ์์ต๋๋ค.์ด ๊ตฌ์กฐ๋ ์๋ ์ ํ ์์ฑ์ ์ง์ ํ ์ ์์ต๋๋ค. ์ด ์์ฑ๋ค์ ๋ง๋ค๊ณ ์๋api ํค์๋ง ์ ์ฉ๋ฉ๋๋ค.์์ฑ๋ API ํค์๋ ํ ๋น๋ ๋ฐ ์ ํ ๋ฑ ์ง์ ๋ ์๋ ์ ํ์ด ์ ์ฉ๋ฉ๋๋ค.const rateLimitedKey = new apigw.RateLimitedApiKey(this, 'rate-limited-api-key', {
apiKeyName: 'av-rate-limited-api-key',
value: 'av-api-key-value-dreatenbwebrwiukjwnrn',
customerId: 'external-client',
resources: [eventGateway],
quota: {
limit: 5,
period: apigw.Period.DAY
},
throttle: {
rateLimit: 2,
burstLimit: 1
}
});
plan.addApiKey(rateLimitedKey);
์๋ก ๋ง๋ api ํค๋ฅผ ์ํ ์๋ก์ด ๊ณํ์ ์ฐพ์ ์ ์๋๋กapi ์ปจํธ๋กค๋ฌ์์ ๊ฒ์ฌํ ์ ์์ต๋๋ค.๋ค๋ฅธ ์ฌ์ฉ ๊ณํ์ ์ํ์ง ์๋ ๊ฐ๋ณ ์ฌ์ฉ์๋ฅผ ๋์ฑ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.๊ธฐ์กด ํค ๋ฐ ์ฌ์ฉ ๊ณํ ๊ฐ์ ธ์ค๊ธฐ๐
์ด์ธ์, ์ฐ๋ฆฌ๋ ์๋์ ์์๋ฅผ ํตํด ๊ธฐ์กด ํค์ ์ฌ์ฉ ๊ณํ์ ์ฐ๋ฆฌ์ ์ฐฝ๊ณ ์์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
usage plans can be imported into a CDK app using its id.
const importedUsagePlan = apigateway.UsagePlan.fromUsagePlanId(this, 'imported-usage-plan', '<usage-plan-key-id>');
API keys can also be imported into a CDK app using its id.
const importedKey = apigateway.ApiKey.fromApiKeyId(this, 'imported-key', '<api-key-id>');
์ดapi ์ธํฐํ์ด์ค์ lambda์ ๋ ๋ง์ ์ฐ๊ฒฐ์ ์ถ๊ฐํ๊ณ ๋ค์ ๊ธ์์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.โญ ์ฐ๋ฆฌ์ ๋ค์ ๊ธ์ ์๋ฒless์ ๋ฐํ๋ ๊ฒ์ด๋, ๋ฐ๋์ ๋ณด์ญ์์ค
๐ ์ง์งํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!๐
๋ง์ฝ ๋ค๊ฐ โ Buy Me a Coffee๋๋ฅผ ๋๊ธฐ๋ฅผ ์ํ๋ค๋ฉด, ์ ๋ง ์ข๊ฒ ๋ค.
๐ ์๋๐ Dev Post
๐ ์ ์ฌํ๋ค๐
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ก AWS CDK 101โ๏ธ - API ๊ฒ์ดํธ์จ์ด ๊ตฌ์กฐ ์ฌ์ฉ, ์ ํ, ํ ๋น๋, ์ฌ์ฉ ๊ณํ, API ํค), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/aravindvcyber/aws-cdk-101-api-gateway-construct-usage-throttle-quota-usage-plans-api-keys-59chํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค