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

BLEA v3.0.0の新しいベストプラクティスを取り入れた効率的なAWS CDK開発/jaw...

BLEA v3.0.0の新しいベストプラクティスを取り入れた効率的なAWS CDK開発/jawsug_cdk16

2024/09/25 JAWS-UG支部 #16 ~CDK Conference 2024 Extra~の登壇資料です。
イベントURL: https://jawsug-cdk.connpass.com/event/328676/

More Decks by みずほリサーチ&テクノロジーズ株式会社 先端技術研究部

Other Decks in Technology

Transcript

  1. © 2024 Mizuho Research & Technologies, Ltd. AWS CDK Conference

    Japan 2024 Extra BLEA v3.0.0の新しいベストプラクティスを 取り入れた効率的なAWS CDK開発 2024/09/25 小坂 洋祐 0
  2. © 2024 Mizuho Research & Technologies, Ltd. 自己紹介 1 小坂

    洋祐(こさか ようすけ) みずほリサーチ&テクノロジーズ 先端技術研究部所属 業務: • 社内案件支援(AWS基盤設計・構築) • 社内AWSプラットフォームの開発・運用 • クラウド研究(AWSアップデートの確認・検証・情報展開等) 登壇歴: • 2023/11/15 Security-JAWS 「AWS Control Towerを2年弱運用して得たエッセンスと展望」 好きなAWSサービス: AWS Control Tower AWS Cloud Development Kit (AWS CDK) Amazon CodeCatalyst
  3. © 2024 Mizuho Research & Technologies, Ltd. BLEA v3.0.0のベストプラクティスの活用 3

    • マルチスタックからシングルスタックに変更 • Stack→Construct化 • cdk.jsonからparameter.tsへ https://github.com/aws-samples/baseline-environment-on-aws/releases/tag/v3.0.0 を日本語訳 ※今回はBLEAを使ってアーキテクチャを作成したわけではなく、BLEA v3.0.0のコードを参考に1から構成を作った例となります。
  4. © 2024 Mizuho Research & Technologies, Ltd. マルチスタックからシングルスタックに変更 6 従来の考え方

    管理しやすい単位(アプリやDB、ネットワークなどの機能別、またはライフサイクル別など)に スタックを分割。 EC2 Manage Stack EC2 Batch Stack EC2 WEBAP Stack RDS Stack WAF Stack Network Stack DXGW Stack
  5. © 2024 Mizuho Research & Technologies, Ltd. マルチスタックからシングルスタックに変更 7 BLEA

    v3.0.0の考え方 極力シングルスタックで構成(一部例外あり) WAF Stack Main Stack
  6. © 2024 Mizuho Research & Technologies, Ltd. シングルスタックの利点 8 デプロイ時間の短縮

    スタックを分けると、前スタックが終わらないと後続が身動きが取れないが、 シングルスタックだと、作れるものからどんどん作るため、デプロイ時間の短縮に繋がる。 また、クロススタック参照が削減でき、スタック間の依存関係も解消。 マルチスタック シングルスタック Network Stack RDS Stack EC2 WEBAP Stack EC2 Batch Stack EC2 Manage Stack Main Stack 所要時間 短縮分
  7. © 2024 Mizuho Research & Technologies, Ltd. シングルスタックの制限 9 リージョンを跨いでのシングルスタック化は不可

    先の構成図の場合、CloudFrontのWAFはバージニアリージョンに作る必要があるため、 WAFスタックは独立。 バージニアリージョン 東京リージョン
  8. © 2024 Mizuho Research & Technologies, Ltd. シングルスタックの制限 10 リソース数制限:500

    最終的にCloudFormation Templateが生成された際のリソース数500を超えることは不可。 溢れた分は別スタックに切り出す必要あり。 今回は監視系リソースを加えたところ上限を超えたのでサブスタックとして分割 Amazon CloudWatch Sub Stack
  9. © 2024 Mizuho Research & Technologies, Ltd. Stack→Construct化 13 従来の考え方でスタックだったものをコンストラクトに。

    ファイルを分けて作成することでコードの保守性が向上。 import * as cdk from "aws-cdk-lib"; import { Construct } from "constructs"; import * as ec2 from "aws-cdk-lib/aws-ec2"; import { NetworkingParameter } from "../../parameter"; export interface NetworkingProps { readonly networkingParameter: NetworkingParameter; } export class Networking extends Construct { constructor(scope: Construct, id: string, props: NetworkingProps) { super(scope, id); // VPC const vpc = new ec2.Vpc(this, "vpc", { ipAddresses: ec2.IpAddresses.cidr(props.networkingParameter.vpcCidr), subnetConfiguration: [], vpcName: "vpc", }); // 中略(Subnetやルートテーブル、ゲートウェイ系のリソースを設定) } } networking.ts Constructを継承した新しいクラス (カスタムコンストラクト)を作成
  10. © 2024 Mizuho Research & Technologies, Ltd. Stack→Construct化 14 スタック側で、分割したConstructを呼ぶことでリソースをスタックに載せられる。

    // NetworkingPropsを定義 const networkingProps: NetworkingProps = { // 一部略 networkingParameter: props.parameter.networkingParameter, }; // Networking Construct const networking = new Networking(this, "Networking", networkingProps); // SecurityGroupsPropsを定義 const securityGroupsProps: SecurityGroupsProps = { // 一部略 networking: networking, securityGroupsParameter: props.parameter.securityGroupsParameter, }; // SecurityGroups Construct const securityGroups = new SecurityGroups(this,"SecurityGroups", securityGroupsProps,); ・・・略・・・ mainstack.ts NetworkingのConstructをスタック側で呼ぶ SecurityGroupsのConstructをスタック側で呼ぶ 用途別にファイルを分割し、Construct化したことで、 リソースの居場所がわかりやすくなった
  11. © 2024 Mizuho Research & Technologies, Ltd. cdk.jsonからparameter.tsへ 16 従来のパラメータ管理方法

    cdk.jsonファイル内のcontext内で定義。synthやdeploy実行時にパラメータを渡す。 "context": { ・・・中略・・・ "prod": { "branch": "main", "domain": "example.com" }, "dev": { "branch": "develop", "domain": "example.net" } } cdk.json $ npx cdk deploy –c environment=dev 実行時に環境を指定 // 実行時のenvironmentの値を取得 const envKey = app.node.tryGetContext("environment") as string; // environmentの値をキーに、cdk.jsonの値を取得 const envValues = app.node.tryGetContext(envKey) as envValues; // 取得してきたcdk.jsonの環境ごとの値のセットから個々の項目を取得 const branch = envValues["branch"]; const domain = envValues["domain"]; app.ts
  12. © 2024 Mizuho Research & Technologies, Ltd. cdk.jsonからparameter.tsへ 17 BLEA

    v3.0.0のパラメーター管理方法 parameter.ts等の.tsファイルを作成し、TypeScriptのコードとして管理 export interface AppParameter { accountId: string; env?: Environment; envName: string; region: string; wafParameter: WafParameter; networkingParameter: NetworkingParameter; securityGroupsParameter: SecurityGroupsParameter; ec2WebApParameter: Ec2WebApParameter; ec2ManagerParameter: Ec2ManagerParameter; ec2BatchParameter: Ec2BatchParameter; rdsParameter: RdsParameter; } parameter.ts AppParameterというinterfaceでパラメータの型を定義 スタックやConstructの単位でパラメータをまとめ、 Constructに投入しやすくする。(別途typeで定義)
  13. © 2024 Mizuho Research & Technologies, Ltd. cdk.jsonからparameter.tsへ 18 BLEA

    v3.0.0のパラメーター管理方法 AppParameter型として環境ごとのパラメータを定義 export const devParameter: AppParameter = { accountId: "XXXXXXXXXXXX", envName: "Development", region: "ap-northeast-1", wafParameter: {}, //略 networkingParameter: { vpcCidr: vpcCidr, subnets: subnets, }, //略 } export const prodParameter: AppParameter = { accountId: “YYYYYYYYYYYY", envName: "Production", region: "ap-northeast-1", wafParameter: {}, //略 networkingParameter: { vpcCidr: vpcCidr, subnets: subnets, }, //略 } parameter.ts 【開発環境用】AppParameterの型でdevParameterを定義 各パラメータの値を設定 【本番環境用】AppParameterの型でprodParameterを定義 各パラメータの値を設定
  14. © 2024 Mizuho Research & Technologies, Ltd. cdk.jsonからparameter.tsへ 19 parameter.ts化の利点

    app.tsでインポートすれば利用可能 スタックやコンストラクト毎にパラメータをまとめたため、 スタックやコンストラクト作成時の引数が減って可読性も向上! #!/usr/bin/env node import * as cdk from "aws-cdk-lib"; import { MainStack } from "../lib/main-stack"; import { WafStack } from "../lib/waf-stack"; import { BackupStack } from "../lib/backup-stack"; import { devParameter } from "../parameter"; import { prodParameter } from "../parameter"; import { SubStack } from "../lib/sub-stack"; const app = new cdk.App(); const prodWafStack = new WafStack(app, “ProdWafStack", { env: { account: prodParameter.accountId, region: "us-east-1" }, crossRegionReferences: true, wafParameter: prodParameter.wafParameter, }); devParameter, prodPatemeterをインポート スタック作成にパラメータを利用
  15. © 2024 Mizuho Research & Technologies, Ltd. cdk.jsonからparameter.tsへ 20 parameter.ts化の利点

    parameter.ts化により、型定義による恩恵を受けられる 入力時点で誤パラメータを排除 従来のcdk.jsonだと、cdk synth等で実際にテンプレートを作成しないと エラーが発生しない→TypeScriptの良さを活かせていなかった。 interfaceやtypeで型定義 number型にstring型を挿入→エラー
  16. © 2024 Mizuho Research & Technologies, Ltd. 22 まとめ •

    スタックは極力シングルにして、デプロイ時間を短縮 • 関連するリソースをConstructにまとめ、管理しやすいコードに • parameter.tsを活用して、型補完のある、扱いやすいパラメータ定義
  17. © 2024 Mizuho Research & Technologies, Ltd. 23 参考資料 •

    AWS BLEA https://github.com/aws-samples/baseline-environment-on-aws • BLEA開発チームが学んだAWS CDKの開発プラクティス 2023 https://speakerdeck.com/konokenj/blea-cdk-dev-practice-2023
  18. 24