Slide 1

Slide 1 text

弥生株式会社 安田龍之介 © 2024 Yayoi Co., Ltd. All rights reserved. CDKでの自動構築が超簡単で感動した話 ~超初心者向け~

Slide 2

Slide 2 text

© 2024 Yayoi Co., Ltd. All rights reserved. 1 ⚫ 名前 ⚫ 安田 龍之介 ⚫ こんな人 ⚫ 新卒5年目コロナ禍入社の ⚫ 昨年9月から会計Nextのエンジニアに ⚫ 3か月前にCDKデビュー 自己紹介

Slide 3

Slide 3 text

© 2024 Yayoi Co., Ltd. All rights reserved. 2 CDKってなに? AWS CDK AWS CloudFormation CloudFormation Template (JSON or YAML) CloudFormation Stack ソースコード CDK CLI cdk synth cdk deploy CDK CLI このTemplateを 頑張って書いていた これが大変 CDKのおかげでTemplate を簡潔に書けるように なった

Slide 4

Slide 4 text

© 2024 Yayoi Co., Ltd. All rights reserved. 3 CDKって… また新しいことを 覚えないと… なんやかんや 時間かかるんでしょ…? CloudFormationは 書くの大変だったしな… 難しそう…

Slide 5

Slide 5 text

© 2024 Yayoi Co., Ltd. All rights reserved. 4 感動Point 4選 1. 慣れ親しんだあの言語で! 2. これだけでいいんですか…? 3. 複数リソースの作成も楽々じゃないですか 4. 書いてて楽しいじゃん…

Slide 6

Slide 6 text

© 2024 Yayoi Co., Ltd. All rights reserved. 5 1.慣れ親しんだあの言語で!

Slide 7

Slide 7 text

© 2024 Yayoi Co., Ltd. All rights reserved. 6 慣れ親しんだあの言語で! ⚫ 6言語を使用することができるため慣れ親しんだ言語で書くことができる ⚫ 自分やチームのスキルセットにあったものを選択することでより効率的にリソースの設計・管 理が行える!! ⚫ TypeScriptが一番ドキュメントも充実している(気がする) ⚫ AWS CDK自体はTypeScriptで書かれている 言語 サポートされているパッケージ管理ツール TypeScript/JavaScript NPM (ノードパッケージマネージャー) または Yarn Python PIP (Package Installer for Python) Java Maven C# NuGet Go Go モジュール

Slide 8

Slide 8 text

© 2024 Yayoi Co., Ltd. All rights reserved. 7 2.これだけでいいんですか…?

Slide 9

Slide 9 text

© 2024 Yayoi Co., Ltd. All rights reserved. 8 ⚫ 例えばSNS トピックと SQS キューを作成し、 その SNS トピックからのメッセージを SQS キューに送る機能 これだけでいいんですか…? using Amazon.CDK; using Amazon.CDK.AWS.SNS; using Amazon.CDK.AWS.SNS.Subscriptions; using Amazon.CDK.AWS.SQS; using Constructs; namespace CdkTest; public class SnsSqsSubscriptionStack : Stack { internal SnsSqsSubscriptionStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // SNSトピックの作成 var topic = new Topic(this, "MyTopic"); // SQSキューの作成 var queue = new Queue(this, "MyQueue"); // SQSキューをSNSトピックにサブスクライブ topic.AddSubscription(new SqsSubscription(queue)); } } ⚫ CDK ⚫ 20行 ⚫ 400文字

Slide 10

Slide 10 text

© 2024 Yayoi Co., Ltd. All rights reserved. 9 これだけでいいんですか…? Resources: MyTopic86869434: Type: AWS::SNS::Topic Metadata: aws:cdk:path: CdkmokuStack/MyTopic/Resource MyQueueE6CA6235: Type: AWS::SQS::Queue UpdateReplacePolicy: Delete DeletionPolicy: Delete Metadata: aws:cdk:path: CdkmokuStack/MyQueue/Resource MyQueuePolicy6BBEDDAC: Type: AWS::SQS::QueuePolicy Properties: PolicyDocument: Statement: - Action: sqs:SendMessage Condition: ArnEquals: aws:SourceArn: Ref: MyTopic86869434 Effect: Allow Principal: Service: sns.amazonaws.com Resource: Fn::GetAtt: - MyQueueE6CA6235 - Arn Version: "2012-10-17" Queues: - Ref: MyQueueE6CA6235 Metadata: aws:cdk:path: CdkmokuStack/MyQueue/Policy/Resource MyQueueCdkmokuStackMyTopicEA174B526D0F9924: Type: AWS::SNS::Subscription Properties: Endpoint: Fn::GetAtt: - MyQueueE6CA6235 - Arn Protocol: sqs TopicArn: Ref: MyTopic86869434 DependsOn: - MyQueuePolicy6BBEDDAC Metadata: aws:cdk:path: CdkmokuStack/MyQueue/CdkmokuStackMyTopicEA174B52/Resource CDKMetadata: Type: AWS::CDK::Metadata Properties: Analytics: v2:deflate64:H4sIAAAAAAAA/02MSwvCMBCEf4v3dvvwcfMg1WvRtniVNo2wtiYxm1gk9L9LGhBZ2J35htkcsnwD6aqdKGb9EI/YgatNy4aonejmSBC4RipkUXEXQdS2I6ZRGZTC038/R/QicBfLLfdZEMs+yxHZ5weDnWc PKk7SarY0Cil6DK+O0pTcJDtIId8mUJ6aQmp+UCq+ck0oxf69hizJIPWzehBirK0w+ORQhfsF92YCaeAAAAA= Metadata: aws:cdk:path: CdkmokuStack/CDKMetadata/Default Condition: CDKMetadataAvailable Conditions: CDKMetadataAvailable: Fn::Or: - Fn::Or: - Fn::Equals: - Ref: AWS::Region - af-south-1 - Fn::Equals: - Ref: AWS::Region - ap-east-1 - Fn::Equals: - Ref: AWS::Region - ap-northeast-1 - Fn::Equals: - Ref: AWS::Region - ap-northeast-2 - Fn::Equals: - Ref: AWS::Region - ap-south-1 - Fn::Equals: - Ref: AWS::Region - ap-southeast-1 - Fn::Equals: - Ref: AWS::Region - ap-southeast-2 - Fn::Equals: - Ref: AWS::Region - ca-central-1 - Fn::Equals: - Ref: AWS::Region - cn-north-1 - Fn::Equals: - Ref: AWS::Region - cn-northwest-1 - Fn::Or: - Fn::Equals: - Ref: AWS::Region - eu-central-1 - Fn::Equals: - Ref: AWS::Region - eu-north-1 - Fn::Equals: - Ref: AWS::Region - eu-south-1 - Fn::Equals: - Ref: AWS::Region - eu-west-1 - Fn::Equals: - Ref: AWS::Region - eu-west-2 - Fn::Equals: - Ref: AWS::Region - eu-west-3 - Fn::Equals: - Ref: AWS::Region - il-central-1 - Fn::Equals: - Ref: AWS::Region - me-central-1 - Fn::Equals: - Ref: AWS::Region - me-south-1 - Fn::Equals: - Ref: AWS::Region - sa-east-1 - Fn::Or: - Fn::Equals: - Ref: AWS::Region - us-east-1 - Fn::Equals: - Ref: AWS::Region - us-east-2 - Fn::Equals: - Ref: AWS::Region - us-west-1 - Fn::Equals: - Ref: AWS::Region - us-west-2 Parameters: BootstrapVersion: Type: AWS::SSM::Parameter::Value Default: /cdk-bootstrap/hnb659fds/version Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip] Rules: CheckBootstrapVersion: Assertions: - Assert: Fn::Not: - Fn::Contains: - - "1" - "2" - "3" - "4" - "5" - Ref: BootstrapVersion AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI. { "Resources": { "MyTopic86869434": { "Type": "AWS::SNS::Topic", "Metadata": { "aws:cdk:path": "CdkmokuStack/MyTopic/Resource" } }, "MyQueueE6CA6235": { "Type": "AWS::SQS::Queue", "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete", "Metadata": { "aws:cdk:path": "CdkmokuStack/MyQueue/Resource" } }, "MyQueuePolicy6BBEDDAC": { "Type": "AWS::SQS::QueuePolicy", "Properties": { "PolicyDocument": { "Statement": [ { "Action": "sqs:SendMessage", "Condition": { "ArnEquals": { "aws:SourceArn": { "Ref": "MyTopic86869434" } } }, "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Resource": { "Fn::GetAtt": [ "MyQueueE6CA6235", "Arn" ] } } ], "Version": "2012-10-17" }, "Queues": [ { "Ref": "MyQueueE6CA6235" } ] }, "Metadata": { "aws:cdk:path": "CdkmokuStack/MyQueue/Policy/Resource" } }, "MyQueueCdkmokuStackMyTopicEA174B526D0F9924": { "Type": "AWS::SNS::Subscription", "Properties": { "Endpoint": { "Fn::GetAtt": [ "MyQueueE6CA6235", "Arn" ] }, "Protocol": "sqs", "TopicArn": { "Ref": "MyTopic86869434" } }, "DependsOn": [ "MyQueuePolicy6BBEDDAC" ], "Metadata": { "aws:cdk:path": "CdkmokuStack/MyQueue/CdkmokuStackMyTopicEA174B52/Resource" } }, "CDKMetadata": { "Type": "AWS::CDK::Metadata", "Properties": { "Analytics": "v2:deflate64:H4sIAAAAAAAA/02MSwvCMBCEf4v3dvvwcfMg1WvRtniVNo2wtiYxm1gk9L9LGhBZ2J35htkcsnwD6aqdKGb9EI/YgatNy4aonejmSBC4RipkUXEXQdS2I6ZRGZTC038/R/QicBfLLfdZEMs+yxHZ5weDnW cPKk7SarY0Cil6DK+O0pTcJDtIId8mUJ6aQmp+UCq+ck0oxf69hizJIPWzehBirK0w+ORQhfsF92YCaeAAAAA=" }, "Metadata": { "aws:cdk:path": "CdkmokuStack/CDKMetadata/Default" }, "Condition": "CDKMetadataAvailable" } }, "Conditions": { "CDKMetadataAvailable": { "Fn::Or": [ { "Fn::Or": [ { "Fn::Equals": [ { "Ref": "AWS::Region" }, "af-south-1" ] }, { "Fn::Equals": [ { "Ref": "AWS::Region" }, "ap-east-1" ] }, { "Fn::Equals": [ { "Ref": "AWS::Region" }, "ap-northeast-1" ] }, { "Fn::Equals": [ { "Ref": "AWS::Region" }, "ap-northeast-2" ] }, { "Fn::Equals": [ { "Ref": "AWS::Region" }, "ap-south-1" ] }, { "Fn::Equals": [ { "Ref": "AWS::Region" }, "ap-southeast-1" ] }, { "Fn::Equals": [ { "Ref": "AWS::Region" }, "ap-southeast-2" ] }, { "Fn::Equals": [ { "Ref": "AWS::Region" }, "ca-central-1" ] }, { "Fn::Equals": [ { "Ref": "AWS::Region" }, "cn-north-1" ] }, { "Fn::Equals": [ { "Ref": "AWS::Region" }, "cn-northwest-1" ] } ] }, { "Fn::Or": [ { "Fn::Equals": [ { "Ref": "AWS::Region" }, "eu-central-1" ] }, { "Fn::Equals": [ { "Ref": "AWS::Region" }, "eu-north-1" ] ⚫ YAML ⚫ 150行 ⚫ 4600文字 ⚫ JSON ⚫ 330行 ⚫ 6200文字

Slide 11

Slide 11 text

© 2024 Yayoi Co., Ltd. All rights reserved. 10 ⚫ 例えばSNS トピックと SQS キューを作成し、 その SNS トピックからのメッセージを SQS キューに送る機能 これだけでいいんですか…? using Amazon.CDK; using Amazon.CDK.AWS.SNS; using Amazon.CDK.AWS.SNS.Subscriptions; using Amazon.CDK.AWS.SQS; using Constructs; namespace CdkTest; public class SnsSqsSubscriptionStack : Stack { internal SnsSqsSubscriptionStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // SNSトピックの作成 var topic = new Topic(this, "MyTopic"); // SQSキューの作成 var queue = new Queue(this, "MyQueue"); // SQSキューをSNSトピックにサブスクライブ topic.AddSubscription(new SqsSubscription(queue)); } } ⚫ CDK ⚫ 20行 ⚫ 400文字 9割近い 削減!!!

Slide 12

Slide 12 text

© 2024 Yayoi Co., Ltd. All rights reserved. 11 3.複数リソースの作成も楽々じゃないですか

Slide 13

Slide 13 text

© 2024 Yayoi Co., Ltd. All rights reserved. 12 ⚫ CDKではループや条件分岐など「命令型」のコード記述が使える! ⚫ 例)同じようなリソースを複数作成する 複数リソースの作成も楽々じゃないですか Template 作りたいだけの EC2 ソースコード AWS CDK forループ EC2のコードを 書くのは1回だけっ

Slide 14

Slide 14 text

© 2024 Yayoi Co., Ltd. All rights reserved. 13 ⚫ CDKではループや条件分岐など「命令型」のコード記述が使える! ⚫ 例)環境ごとに異なる設定のリソースを定義 複数リソースの作成も楽々じゃないですか 開発環境用 Template テスト環境用 Template 本番環境用 Template 開発環境用 S3 テスト環境用 S3 本番環境用 S3 環境で分岐 ソースコード AWS CDK 環境変数とか これは デフォルト設定のまま これは ライフサイクルルール を作っておく これは レプリケーションルール も作る 他チームへの公開もする 環境ごとに処理を 分岐させてっと

Slide 15

Slide 15 text

© 2024 Yayoi Co., Ltd. All rights reserved. 14 4.書いてて楽しいじゃん…

Slide 16

Slide 16 text

© 2024 Yayoi Co., Ltd. All rights reserved. 15 ⚫ 書くのが楽しい ⚫ JSONやYAMLを書くのは修行のようで避けがち… ⚫ CDKは「こんなにシンプルに!?やるじゃーーーん(何様)」とウキウキ ⚫ ベストプラクティスで構築してくれる ⚫ 大変なVPC構築もベストプラクティスに沿って一発で構築 ⚫ とりあえずフルアクセスを付けがちなIAMも最小権限で設定してくれる ⚫ さすが公式ツール ⚫ 充実したドキュメントやWorkshopで安心 ⚫ 手厚いAWSサポートで安心 書いてて楽しいじゃん…

Slide 17

Slide 17 text

© 2024 Yayoi Co., Ltd. All rights reserved. 16 まずは入門してみませんか? ⚫ ありがたい公式ガイド・ワークショップ ⚫ 「最初の AWS CDK アプリ」 ⚫ 簡単 30分くらいで簡単に体験できる(S3の作成のみ) ⚫ https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/hello_world.html ⚫ 「AWS CDK Workshop」 ⚫ 2時間くらいでもう少し深く知れる ⚫ https://cdkworkshop.com/ja/