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

CDKでの自動構築が超簡単で感動した話(超初心者向け) / Automated construction using CDK was easy, impressed

yayoi_dd
March 28, 2024

CDKでの自動構築が超簡単で感動した話(超初心者向け) / Automated construction using CDK was easy, impressed

弥生株式会社 もくテク
ンフラ構築、どうしてる? ~IaCの知見共有会~(2024/03/28)
https://mokuteku.connpass.com/event/311038/

yayoi_dd

March 28, 2024
Tweet

More Decks by yayoi_dd

Other Decks in Technology

Transcript

  1. 弥生株式会社 安田龍之介 © 2024 Yayoi Co., Ltd. All rights reserved.

    CDKでの自動構築が超簡単で感動した話 ~超初心者向け~
  2. © 2024 Yayoi Co., Ltd. All rights reserved. 1 ⚫

    名前 ⚫ 安田 龍之介 ⚫ こんな人 ⚫ 新卒5年目コロナ禍入社の ⚫ 昨年9月から会計Nextのエンジニアに ⚫ 3か月前にCDKデビュー 自己紹介
  3. © 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 を簡潔に書けるように なった
  4. © 2024 Yayoi Co., Ltd. All rights reserved. 3 CDKって…

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

    4選 1. 慣れ親しんだあの言語で! 2. これだけでいいんですか…? 3. 複数リソースの作成も楽々じゃないですか 4. 書いてて楽しいじゃん…
  6. © 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 モジュール
  7. © 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文字
  8. © 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<String> 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文字
  9. © 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割近い 削減!!!
  10. © 2024 Yayoi Co., Ltd. All rights reserved. 12 ⚫

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

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

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