Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

© 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

Slide 3

Slide 3 text

BLEA v3.0.0のベストプラクティスの活用 2

Slide 4

Slide 4 text

© 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から構成を作った例となります。

Slide 5

Slide 5 text

マルチスタックからシングルスタックに変更 4

Slide 6

Slide 6 text

© 2024 Mizuho Research & Technologies, Ltd. マルチスタックからシングルスタックに変更 5 構成図 以下の構成をCDKで作成(一部略)

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

© 2024 Mizuho Research & Technologies, Ltd. マルチスタックからシングルスタックに変更 7 BLEA v3.0.0の考え方 極力シングルスタックで構成(一部例外あり) WAF Stack Main Stack

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

© 2024 Mizuho Research & Technologies, Ltd. シングルスタックの制限 9 リージョンを跨いでのシングルスタック化は不可 先の構成図の場合、CloudFrontのWAFはバージニアリージョンに作る必要があるため、 WAFスタックは独立。 バージニアリージョン 東京リージョン

Slide 11

Slide 11 text

© 2024 Mizuho Research & Technologies, Ltd. シングルスタックの制限 10 リソース数制限:500 最終的にCloudFormation Templateが生成された際のリソース数500を超えることは不可。 溢れた分は別スタックに切り出す必要あり。 今回は監視系リソースを加えたところ上限を超えたのでサブスタックとして分割 Amazon CloudWatch Sub Stack

Slide 12

Slide 12 text

© 2024 Mizuho Research & Technologies, Ltd. 11 1スタックにするとリソースがごちゃごちゃして可読性落ちるのでは? Constructを活用

Slide 13

Slide 13 text

Stack→Construct化 12

Slide 14

Slide 14 text

© 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を継承した新しいクラス (カスタムコンストラクト)を作成

Slide 15

Slide 15 text

© 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化したことで、 リソースの居場所がわかりやすくなった

Slide 16

Slide 16 text

cdk.jsonからparameter.tsへ 15

Slide 17

Slide 17 text

© 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

Slide 18

Slide 18 text

© 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で定義)

Slide 19

Slide 19 text

© 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を定義 各パラメータの値を設定

Slide 20

Slide 20 text

© 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をインポート スタック作成にパラメータを利用

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

まとめ 21

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

© 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

Slide 25

Slide 25 text

24