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

最初からAWS CDKで技術検証してもいいんじゃない?

最初からAWS CDKで技術検証してもいいんじゃない?

More Decks by アキキー | Akihisa Ikeda

Other Decks in Programming

Transcript

  1. CDKから検証するといいこともあります import path from "node:path"; import { NodejsFunction } from

    "aws-cdk-lib/aws-lambda-nodejs"; import { LambdaRestApi } from "aws-cdk-lib/aws-apigateway"; import { AttributeType, Table } from "aws-cdk-lib/aws-dynamodb"; import { Construct } from "constructs"; export class MyConstruct extends Construct { constructor(scope: Construct, id: string) { super(scope, id); // DynamoDB Table const table = new Table(this, "Table", { partitionKey: { name: "id", type: AttributeType.STRING }, }) ⭕️ 設定内容がコードとして残るので再現性が高い ⭕️ 本番のワークロードに昇華しやすい ⭕️ リソースの消し忘れが少なくなる ⭕️ 簡単に作り直せるので使わない間はリソースを削除できる
  2. CDKから検証するといいこともあります import path from "node:path"; import { NodejsFunction } from

    "aws-cdk-lib/aws-lambda-nodejs"; import { LambdaRestApi } from "aws-cdk-lib/aws-apigateway"; import { AttributeType, Table } from "aws-cdk-lib/aws-dynamodb"; import { Construct } from "constructs"; export class MyConstruct extends Construct { constructor(scope: Construct, id: string) { super(scope, id); // DynamoDB Table const table = new Table(this, "Table", { partitionKey: { name: "id", type: AttributeType.STRING }, }) ⭕️ 設定内容がコードとして残るので再現性が高い ⭕️ 本番のワークロードに昇華しやすい ⭕️ リソースの消し忘れが少なくなる ⭕️ 簡単に作り直せるので使わない間はリソースを削除できる
  3. 専用プラグイン eslint-plugin-awscdk により、CDKのセオリー・ ベストプラクティスを強制できる おすすめカスタマイズ ① Linter ESLint コードを解析してルールに従って検査するツール //

    Construct ID must be PascalCase. (awscdk/pascal-case-construct-id) new Bucket(this, 'my-bucket'); ① 専用のリポジトリを作成するべし 💡 構文エラーを事前に解析できる 💡 CDKの落とし穴につまづきにくくなる Find and fix problmes in your JavaScript code https://eslint.org/ eslint-plugin-awscdk - ESLint plugin for AWS CDK https://eslint-plugin-awscdk.dev/ja/
  4. 専用プラグイン eslint-plugin-awscdk により、CDKのセオリー・ ベストプラクティスを強制できる おすすめカスタマイズ ① Linter ESLint コードを解析してルールに従って検査するツール //

    Construct ID must be PascalCase. (awscdk/pascal-case-construct-id) new Bucket(this, 'my-bucket'); ① 専用のリポジトリを作成するべし 💡 構文エラーを事前に解析できる 💡 CDKの落とし穴につまづきにくくなる Find and fix problmes in your JavaScript code https://eslint.org/ eslint-plugin-awscdk - ESLint plugin for AWS CDK https://eslint-plugin-awscdk.dev/ja/
  5. おすすめカスタマイズ ② Formatter Oxfmt コードを解析してルールに従って整形するツール import {NodejsFunction, Code} from "aws-cdk-lib/aws-lambda"

    import {Construct} from "constructs" export class MyConstruct extends Construct{constructor(scope:Construct,id:string){super new NodejsFunction(this,"Function",{entry: path.join(__dirname, "src/handler.ts"),})}} ① 専用のリポジトリを作成するべし 💡 コードのスタイルが統一されるので読みやすくなる Oxfmt https://oxc.rs/docs/guide/usage/formatter.html
  6. おすすめカスタマイズ ② Formatter Oxfmt コードを解析してルールに従って整形するツール import { NodejsFunction } from

    "aws-cdk-lib/aws-lambda"; import { Construct } from "constructs"; export class MyConstruct extends Construct { constructor(scope: Construct, id: string) { super(scope, id); new NodejsFunction(this, "Function", { entry: path.join(__dirname, "src/handler.ts"), }); } } ① 専用のリポジトリを作成するべし 💡 コードのスタイルが統一されるので読みやすくなる Oxfmt https://oxc.rs/docs/guide/usage/formatter.html
  7. おすすめカスタマイズ ② Formatter Oxfmt コードを解析してルールに従って整形するツール import { NodejsFunction } from

    "aws-cdk-lib/aws-lambda"; import { Construct } from "constructs"; export class MyConstruct extends Construct { constructor(scope: Construct, id: string) { super(scope, id); new NodejsFunction(this, "Function", { entry: path.join(__dirname, "src/handler.ts"), }); } } ① 専用のリポジトリを作成するべし 💡 コードのスタイルが統一されるので読みやすくなる Oxfmt https://oxc.rs/docs/guide/usage/formatter.html
  8. おすすめカスタマイズ ③ Test Snapshot Test CDKから生成するテンプレートの差分を検証する "Queue4A7E3555": { "Type": "AWS::SQS::Queue",

    "Properties": { - "VisibilityTimeout": 30, + "VisibilityTimeout": 60, }, "DeletionPolicy": "Delete", "UpdateReplacePolicy": "Delete", } ① 専用のリポジトリを作成するべし 💡 意図しないプロパティを設定することを防げる 💡 こまめにアップデートしておけば差分が見やすい AWS CDK スナップショットテストのプラクティス集 https://zenn.dev/aki_kii/articles/cdk-snapshottest-practice
  9. おすすめカスタマイズ ③ Test Snapshot Test CDKから生成するテンプレートの差分を検証する "Queue4A7E3555": { "Type": "AWS::SQS::Queue",

    "Properties": { - "VisibilityTimeout": 30, + "VisibilityTimeout": 60, }, "DeletionPolicy": "Delete", "UpdateReplacePolicy": "Delete", } ① 専用のリポジトリを作成するべし 💡 意図しないプロパティを設定することを防げる 💡 こまめにアップデートしておけば差分が見やすい AWS CDK スナップショットテストのプラクティス集 https://zenn.dev/aki_kii/articles/cdk-snapshottest-practice
  10. → CDKの便利機能 ① L2 Construct プロパティを扱いやすいように抽象化したコンポーネント new Vpc(this, "Vpc", {

    ipAddresses: IpAddresses.cidr("10.0.0.0/16"), subnetConfiguration: [ { cidrMask: 24, name: "public", subnetType: SubnetType.PUBLIC, }, ], }); ③ CDKの便利機能を活用するべし CDK アプリケーションの複雑さを軽減する L2 Construct の活用 https://aws.amazon.com/jp/blogs/news/leverage-l2-constructs-to-reduce-the-complexity-of-your-aws-cdk-application/
  11. CDKの便利機能 ② Grants リソース間のIAMロールの設定を直感的かつ簡単に設定できる // Lambda 関数 const func =

    new NodejsFunction(this, "Function", { entry: path.join(__dirname, "../../src/lambda/index.ts"), }); // DynamoDB テーブル const table = new Table(this, "Table", { partitionKey: { name: "id", type: AttributeType.STRING }, }); // Lambda 関数がDynamoDB に対して読み書きできる権限を付与 table.grants.readWriteData(func); ③ CDKの便利機能を活用するべし AWS CDK を使用して L2 コンストラクトのアクセス許可を定義する https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/define-iam-l2.html
  12. CDKの便利機能 ③ fromLookup デプロイ済みのリソースをCDKで参照できる const vpc = Vpc.fromLookup(this, "ExistingVpc", {

    // デプロイ済みのVPC vpcId: "vpc-1234567890abcdef0", }); new Cluster(this, "Cluster", { // ECS クラスターを参照したVPC に配置 vpc, }); ③ CDKの便利機能を活用するべし リソースと AWS CDK https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/resources.html
  13. AWS Infrastructure as Code MCP Server AWS の IaC に関連する機能をたくさん提供している

    デプロイ失敗のトラブルシューティング CloudFormationテンプレートの検証 CDK ドキュメントの検索(CDK/CloudFormation/サンプルコード) ベストプラクティスに沿った実装 コンプライアンスチェック(cfn-guard) AWS CDK MCP Serverは非推奨になり、こちらが推奨されています ...などなど ⑤ コーディングエージェントに頼るべし AWS IaC MCP Server https://awslabs.github.io/mcp/servers/aws-iac-mcp-server