Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CDKとCloudFormationどちらが好み?
Search
NaoyaYamamoto
April 15, 2025
3
1.1k
CDKとCloudFormationどちらが好み?
AWS Community Builder (Dev Tools)
JAWS-UG 東京
AWS Community Builders Night
2025年4月15日 (火)
NaoyaYamamoto
April 15, 2025
Tweet
Share
More Decks by NaoyaYamamoto
See All by NaoyaYamamoto
WAFRの新常識!? IaCコードからレビューを効率化
naonana777
3
430
なんでも効率化!Community Builderが伝える AWS Developer Toolsの魅力
naonana777
4
440
Edtechって何だ?完全ド素人が学んだことを報告する
naonana777
2
220
AWS Infrastructure Composerの良さを伝えたい
naonana777
1
570
AWS Community Buildersのススメ
naonana777
4
240
IaCジェネレーターはマネコンとCDKの架け橋になれるのか
naonana777
1
220
デプロイのベストプラクティス
naonana777
1
450
とあるチームの手動作業の多いCloudFormation運用とその改善
naonana777
0
240
Well-Architectedレビューの啓蒙活動
naonana777
0
42
Featured
See All Featured
Bash Introduction
62gerente
613
210k
Embracing the Ebb and Flow
colly
86
4.8k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
970
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
830
Facilitating Awesome Meetings
lara
54
6.5k
GitHub's CSS Performance
jonrohan
1031
460k
The Invisible Side of Design
smashingmag
301
51k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
990
How STYLIGHT went responsive
nonsquared
100
5.6k
Speed Design
sergeychernyshev
32
1k
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.7k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Transcript
CDKとCloudFormationどちらが好み? 山本 直弥 AWS Community Builder (Dev Tools) JAWS-UG 東京
AWS Community Builders Night 2025年4月15日 (火)
名前:山本 直弥 (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 2024年10月28日(月) 名古屋は“CDKの街”と呼ばれる 名古屋のエンジニアが一斉に 「名古屋はCDKの街」 と世界に発信する事象が発生 今日からここを、 CDKの街とするッ!!! 当時のX→ 背景
~名古屋はCDKの街~
3 IaC・・・ IaC勉強するぞー 背景 ~名古屋のLT大会:「IaC運用のリアルを語りたい!」~ ↓自分(この日LT予定) LT 頑張るぞー (燃) ↑IaC勉強したい人、集結
4 CloudFormation使ってる人ー? は~い ※この後、CloudFormationのLT予定 ・・・ 背景 ~IaCツール何を使っているか コール&レスポンス~ ←自分 ↑登壇者
↑他の参加者
5 CDK使ってる人ー? ハーイ! ※ほぼ全員 ・・・! 背景 ~悲報、名古屋民CDK派しかいない~ ←自分 ↑登壇者 ↑他の参加者
ハーイ! ※ほぼ全員 ハーイ! ※ほぼ全員
6 名古屋はCDKの街ー☆ 名古屋はCDKの街ー☆ これが「名古屋はCDKの街」と呼ばれる始まりだった・・・ この後 CloudFormation のLTするんだが うぇーい! 背景 ~CDKの街、爆誕~
←自分 名古屋はCDKの街って 伝えなきゃ エッホエッホ Xポスト ↑他の参加者 ↑登壇者 名古屋はCDKの街ー☆ 名古屋はCDKの街ー☆
7 • CDKがデファクトスタンダードだから? • CloudFormationは何がデメリット? • あらゆる場面でCDKがベストな選択になる? AWS CloudFormation (
Cfn ) AWS Cloud Development Kit ( AWS CDK ) CDKだけではなく、CloudFormationも活躍できる場はないか? ※ Terraformのことは一旦、忘れます 疑問 ~なぜCDKを選ぶ人が多い? ~
8 まずは世界の利用者の声を聴いてみよう 訳:CDK を超える CloudFormation の利点とは何か? 海外サイトでよさそうなスレッドを発見
デプロイが簡単なこと以外に Cfnにメリットなし みんな最初は使う けど、すぐに飽きる 利用者の声、 CloudFormationの利点はないらしい Cfnにメリット無し 大規模環境ではCfnは 避けるべき Cfnにメリット無し
参考:https://www.reddit.com/r/aws/comments/17pxpam/benefit_of_cloudformation_over_cdk/?rdt=62676
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コードの 作成と運用が大変 (管理するコードが多い) 簡単に利用者の声をまとめると コード作成が大変って、どれくらい大変?
{ "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 構成 コード変換すると 行数が多いと 可読性が下がる
コード量が多いなら分割すれば良い?そんな簡単じゃなかった 12 リソースの種類ごとに分割? システムの単位で分割? 参考:https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-CloudFormation-Dev-Test-Deploy_1231_v1.pdf スタック間の参照を 調整するのが大変 デプロイ順序や 削除の考慮が必要 テンプレートがあま
り短くならない どう分割しても、課題が残る・・・ Cfn、検討事多すぎワロタ
13 • CDKがCloudFormationのIaCコードを効率的に管理するツールであるように、 他のツールと組み合わせることで、 CloudFormationの活用の幅を広げられるのでは? AWS CloudFormation AWS CDK Cfn単独運用はきつそう。
他のツールを組み合わせてはどうか? 他にツールの選択肢はないのか? 他のツールもありなのかよ
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駆動開発
15 • マネコンポチポチでリソースを作った後、一括でIaC(Cfnテンプレート化)できる! マネコン ノーコードで IaCコードができた! IaCジェネレータを使えばマネコンポチポチでIaCコードが書ける ポチ! ポチ! ポチポチ!
テンプレート ↑テンプレートにしたいリソース選択 ↑スキャン開始 ↑IaCジェネレーター選択 ↑マネコンで作った リソース ・・・・・ CDK コマンド操作で CDKコードに変換可能
16 • GUIを操作すると、操作の結果を自動でIaCコードにしてくれる便利ツール Infrastructure Composer ならGUI操作でIaCコードが作れる 構成も見やすくてIaC コードも自動生成 リソースの関連を GUIで作成
StepFunctionsフロー をGUIで作成 穴埋めでコードを 見ずに定義作成 ・・・・・ 自動コード化 自動コード化
17 生成AIを利用してIaCコードを対話形式で作成できる AIでIaCコード 作成/運用が楽々 Amazon Qで 対話形式でテンプレート作成、修正 Clineで対話形式でテンプレート作成、エラーチェック (ローカルのファイルも分析して回答をくれる) 素敵やん
18 • CloudFormation単体運用はつらいが、他ツールを使えば便利な使い方ができる • 今後も(生成AI含む)ツールの組み合わせにより、既存ツールの活躍の幅が広がる、 ツールが持つデメリット解消や実装、学習のハードルが下がると期待 • (個人的には)いろいろツールを工夫して活用を考えるのは 、 “楽しい”
→DevToolsのコミュニティビルダーとしてツールの良さを好みや偏りなく発信していきたい DevToolsはCDKだけじゃないって伝えなきゃ まとめ DevToolsのCBとして、ツールの良さを伝えなきゃ
ご清聴ありがとうございました 19 次はAWS Summitでお会いしましょ! (名古屋にも遊びに来てね) JAWS-UG名古屋では毎月オフラインイベントを開催しています https://jawsug-nagoya.connpass.com/