Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CDKとCloudFormationどちらが好み?

NaoyaYamamoto
April 15, 2025
510

 CDKとCloudFormationどちらが好み?

AWS Community Builder (Dev Tools)
JAWS-UG 東京
AWS Community Builders Night
2025年4月15日 (火)

NaoyaYamamoto

April 15, 2025
Tweet

Transcript

  1. 名前:山本 直弥 (SNSでは Nao) 所属:株式会社シーイーシー 在住:CDKの街 名古屋 出身:京都 2025~ AWS

    Community Builders ( DevTools ) 2025~ JAWS-UG 名古屋 運営メンバー 2023-2024 Japan AWS All Certifications Engineer 社内のWell-Architected Program リード 好きなAWSサービス: AWS Step Functions、 AWS CloudFormation AWS Lambda、 AWS CDK ※Xのアイコン 自己紹介
  2. 6 名古屋はCDKの街ー☆ 名古屋はCDKの街ー☆ これが「名古屋はCDKの街」と呼ばれる始まりだった・・・ この後 CloudFormation のLTするんだが うぇーい! 背景 ~CDKの街、爆誕~

    ←自分 名古屋はCDKの街って 伝えなきゃ エッホエッホ Xポスト ↑他の参加者 ↑登壇者 名古屋はCDKの街ー☆ 名古屋はCDKの街ー☆
  3. 7 • CDKがデファクトスタンダードだから? • CloudFormationは何がデメリット? • あらゆる場面でCDKがベストな選択になる? AWS CloudFormation (

    Cfn ) AWS Cloud Development Kit ( AWS CDK ) CDKだけではなく、CloudFormationも活躍できる場はないか? ※ Terraformのことは一旦、忘れます 疑問 ~なぜCDKを選ぶ人が多い? ~
  4. 10 • CDK自体がCfn運用を楽にするためのツール。Cfnテンプレートを効率的に作れる。 → CfnにできることはCDKでもできるので Cfn を選択する理由がほとんどない • Cfnはデプロイが簡単だが、コードを書く量が多くて大変 →管理するインフラが大きくなればなるほどCfnのデメリットが浮き彫りになる

    AWS CloudFormation ( Cfn ) AWS Cloud Development Kit ( AWS CDK ) CDKはCfnテンプレートが作れる のでCfn用ツールも使える CDKによりCfnのコードを短 くでき、運用負荷を低減 Cfnはデプロイが簡単 CfnはIaCコードの 作成と運用が大変 (管理するコードが多い) 簡単に利用者の声をまとめると コード作成が大変って、どれくらい大変?
  5. { "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 構成 コード変換すると 行数が多いと 可読性が下がる
  6. 14 • CDK以外にも、便利なツールがたくさんある。 CloudFormation運用をサポートできるツールがいくつも登場 ・・・・・!! 2019年7月 CDK 登場 2020年11月 Rain

    1.0 登場 これならCloudFormationも活躍できるかも 2024年2月 IaCジェネレーター リリース Rain 生成AIによるコード生成 対応 2023年3月 AWS Application Composer (現 Infrastructure Composer) GA 2024年10月 Console-to-Code GA AWS Application Composer GUI操作でIaCコード管理 IaCジェネレーター 実環境をIaCコード化 Console-to-Code マネコン操作をIaC コード変換 Rain コマンドで雛形作成、 スタック管理 2024年12月~ Amazon Q Developer、 Cline、MCP いろいろ応用 Amazon Q Developer エラー原因調査支援 チャット形式開発 AI駆動開発
  7. 15 • マネコンポチポチでリソースを作った後、一括でIaC(Cfnテンプレート化)できる! マネコン ノーコードで IaCコードができた! IaCジェネレータを使えばマネコンポチポチでIaCコードが書ける ポチ! ポチ! ポチポチ!

    テンプレート ↑テンプレートにしたいリソース選択 ↑スキャン開始 ↑IaCジェネレーター選択 ↑マネコンで作った リソース ・・・・・ CDK コマンド操作で CDKコードに変換可能