Slide 12
Slide 12 text
{
"Resources": {
"TESTMyLambdaFunctionServiceRole6FF4D431": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}
],
"Version": "2012-10-17"
},
"ManagedPolicyArns": [
{
"Fn::Join": [
"",
[
"arn:",
{
"Ref": "AWS::Partition"
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
]
}
]
},
"Metadata": {
"aws:cdk:path": "CdkHelloWorldStack/TESTMyLambdaFunction/ServiceRole/Resource"
}
},
"TESTMyLambdaFunction8E16014C": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"S3Bucket": "cdk-hnb659fds-assets-111111111111-ap-northeast-1",
"S3Key": "fe7e1908d59e783c3f2793117673f2e93c85f0ce91cd99bed0239de3d41e8d3b.zip"
},
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"TESTMyLambdaFunctionServiceRole6FF4D431",
"Arn"
]
},
"Runtime": "nodejs20.x"
},
"DependsOn": [
"TESTMyLambdaFunctionServiceRole6FF4D431"
],
"Metadata": {
"aws:cdk:path": "CdkHelloWorldStack/TESTMyLambdaFunction/Resource",
"aws:asset:path": "asset.fe7e1908d59e783c3f2793117673f2e93c85f0ce91cd99bed0239de3d41e8d3b",
"aws:asset:is-bundled": false,
"aws:asset:property": "Code"
}
},
"MyApiGateway04A753E5": {
"Type": "AWS::ApiGateway::RestApi",
"Properties": {
"Name": "MyApiGateway"
},
"Metadata": {
"aws:cdk:path": "CdkHelloWorldStack/MyApiGateway/Resource"
}
},
"MyApiGatewayDeployment44AAC0313efdafc08b1d170892a3a89794c0f77f": {
"Type": "AWS::ApiGateway::Deployment",
"Properties": {
"Description": "Automatically created by the RestApi construct",
"RestApiId": {
"Ref": "MyApiGateway04A753E5"
}
},
"DependsOn": [
"MyApiGatewayitemsGETBDFA38EE",
"MyApiGatewayitemsPOST3EB9C420",
"MyApiGatewayitemsAC8CBE57"
],
"Metadata": {
"aws:cdk:path": "CdkHelloWorldStack/MyApiGateway/Deployment/Resource"
}
},
"MyApiGatewayDeploymentStageprodEBC77C1B": {
"Type": "AWS::ApiGateway::Stage",
"Properties": {
"DeploymentId": {
"Ref": "MyApiGatewayDeployment44AAC0313efdafc08b1d170892a3a89794c0f77f"
},
"RestApiId": {
"Ref": "MyApiGateway04A753E5"
},
"StageName": "prod"
},
"Metadata": {
"aws:cdk:path": "CdkHelloWorldStack/MyApiGateway/DeploymentStage.prod/Resource"
}
},
"MyApiGatewayitemsAC8CBE57": {
"Type": "AWS::ApiGateway::Resource",
"Properties": {
"ParentId": {
"Fn::GetAtt": [
"MyApiGateway04A753E5",
"RootResourceId"
]
},
"PathPart": "items",
"RestApiId": {
"Ref": "MyApiGateway04A753E5"
}
},
"Metadata": {
"aws:cdk:path": "CdkHelloWorldStack/MyApiGateway/Default/items/Resource"
}
},
"MyApiGatewayitemsGETApiPermissionCdkHelloWorldStackMyApiGateway18BBB2E7GETitemsAE87E112": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"Action": "lambda:InvokeFunction",
"FunctionName": {
"Fn::GetAtt": [
"TESTMyLambdaFunction8E16014C",
"Arn"
]
},
"Principal": "apigateway.amazonaws.com",
"SourceArn": {
"Fn::Join": [
"",
[
"arn:aws:execute-api:ap-northeast-1:111111111111:",
{
11
CloudFormationはそんなにコーディングが大変?
CDKのコード
(30行くらい)
CloudFormationのコード
(350行くらい)
10倍以上長いコードを手動で書いて運用するのは非効率かも
Cfn、長すぎワロタ
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
export class CdkHelloWorldStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Lambda関数を定義
const myLambda = new lambda.Function(this, 'TESTMyLambdaFunction', {
runtime: lambda.Runtime.NODEJS_20_X,
code: lambda.Code.fromAsset('lambda'),
handler: 'index.handler',
});
// API Gateway を定義
const api = new apigateway.LambdaRestApi(this, 'MyApiGateway', {
handler: myLambda,
proxy: false,
});
// メソッドを設定
const items = api.root.addResource('items');
items.addMethod('GET'); // GET /items
items.addMethod('POST'); // POST /items
}
}
const app = new cdk.App();
new CdkHelloWorldStack(app, 'CdkHelloWorldStack');
Lambdaを呼び出すAPI
構成
コード変換すると
行数が多いと
可読性が下がる