AWS CDKにおける参照にはさまざまな形があります。ConstructやStackをまたいだ参照、クロスリージョンリファレンス、AWSアカウント内のリソースの参照などです。このセッションではCDKにおけるさまざまな参照の仕組みを整理し、意図の明らかなコードを書くための使い分け方法を検討します。
AWS CDK Conference Japan 2023 の登壇資料です。
※ 資料内のリンクにアクセスしたい場合は PDF をダウンロードしてご利用ください。
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk© 2023, Amazon Web Services, Inc. or its affiliates.実践 AWS CDKKono, Kenjiいろいろな参照のカタチと使い分けA W S C D K C O N F E R E N C E J A P A N 2 0 2 3Solutions ArchitectAmazon Web Services Japan G.K.2023/5/20
View Slide
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk⾼野 賢司ソリューションアーキテクト @名古屋アマゾンウェブサービスジャパン合同会社趣味こうの東海地⽅のこれから AWS を使い始めるエンタープライズ企業をサポートしています得意領域Infrastructure as Code (IaC), AWS CDK, DevOps, SaaS 構築/運⽤Baseline Environment on AWS (BLEA) 開発者https://github.com/aws-samples/baseline-environment-on-awsけんじ• サウナ• ⾃作キーボード• マンガ
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜ゴール• AWS CDK と AWS CloudFormation の動きをイメージしながらコードを書けるようにすること想定聴講者• AWS CDK をディープに使いこなしたい開発者• AWS CDK の裏側で何が起こっているか興味がある⽅3
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkコードと動作をイメージできますか︖5イベントは他のサービスのSNS Topic に流れてくるから参照してサブスクライブしてねDynamoDB テーブルは⼿動で作ったからインポートしといてVPC 部分は昔のCloudFormation テンプレートをインクルードして再利⽤しようCDK が得意な先輩あなたは、先輩から Amazon ECS でアプリの作成を依頼されましたTopicVPCTableECS ClusterService🤔
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk本セッションで解説する『参照のカタチ』1. CDK App 内のリソースの参照2. CDK App 外のリソースの参照3. SSM Parameter Store の参照4. SSM Secure String と Secrets Manager の参照5. CDK 実⾏環境でのパラメータの参照6. CloudFormation テンプレートのインクルード7. CloudFormation へのリソースのインポート6
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk© 2023, Amazon Web Services, Inc. or its affiliates.AWS CDK とAWS CloudFormation の関わり7
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDK のしくみプログラミング⾔語でインフラ構成を定義開発者TypeScript JavaScript PythonJava .NET Go各⾔語のコンストラクトライブラリを利⽤AWS CDK Toolkit (CLI)CloudFormation テンプレートに変換アセットのバンドルとデプロイ$ cdk deployNode.jsNode.js のコマンドラインツールクラウドリソース⽬的の状態に収束API 呼び出しAWS CloudFormationテンプレートに従いリソースを⽬的の状態にする• S3 バケットがなかったら作成• 状態が違っていたら更新• 状態が同じなら何もしない etc.テンプレートに変換• Lambda関数のコード• コンテナイメージ• ファイル などアセットのデプロイテンプレートと設定をスタックとして管理
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDK と AWS CloudFormation の関わり9AWS CloudTopicTable現実世界• さまざまな⼿段で変更されうる• CloudFormation で管理されていないものもあるAWS CloudFormationStackCopy ofTemplateIaC サービスの世界• ユーザーの指⽰をテンプレートとして受け取って API を呼び出し• スタックに永続化• テンプレートのコピー• 管理しているリソースの設定• Export / Import された値Props ofResources* Asset はここでは図⽰していませんAWS CDKConstruct Prepare Validate SynthetizeSourcecodeCloudFormationTemplateプログラミングの世界• パラメータを含めすべて Git で管理される決定論的な世界• CloudFormation テンプレートにロジックを含めることはできない *• 未確定な値は CDK または別のプログラムで解決するかCloudFormation の機能で渡す必要がある* ここでは任意の処理を組み込めるわけではないことを指す。Fn::If や Fn::FindInMap などで単純なロジックは記述可能。Deploy
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk© 2023, Amazon Web Services, Inc. or its affiliates.『参照』のカタチ10
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDK1. CDK App 内のリソースの参照11AWS CloudAWS CloudFormationStackConstruct Prepare Validate SynthetizeTopicTableSourcecodeCloudFormationTemplateCopy ofTemplateProps ofResourcesconst taskRole = new iam.Role(this, 'EcsTaskRole', {assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),});const taskDefinition = new ecs.FargateTaskDefinition(this,'TaskDefinition', {executionRole: taskExecutionRole,taskRole: taskRole,cpu: 256,memoryLimitMiB: 512,});TypeScripthttps://github.com/aws-samples/baseline-environment-on-aws/blob/f10bcf1167977976b8129483b2e26c46aef4006e/usecases/blea-guest-ecs-app-sample/lib/construct/ecsapp.ts#L197組み込み関数で値を解決Deploy"TaskRoleArn": {"Fn::GetAtt": ["EcsAppEcsTaskRole2B17F49D","Arn"]}TemplateCDK アプリのコード内でリソースを参照するとCloudFormation の組み込み関数に変換される※ CDK App 内で値にアクセスすると Token が返る
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk参照するリソースがどこにあるかで動作が変わる12AppStageStackConstruct ConstructStackConstructStageStackConstructRegion ARegion B12341234同じ Stack 内のリソース→ !Ref または !GetAtt別の Stack 内のリソース→ Export と !ImportValue のセット別のリージョンのリソース→ Export と Custom Resource によって消費側のリージョンに SSM Parameter を作成しCloudFormation の !GetAtt で取得別の Stage 内のリソース→ 参照不可(Synth 時にエラーになる)https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk-lib/core/adr/cross-region-stack-references.md
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkCloudFormation における強い参照と弱い参照強い参照Export した値を !ImportValue で参照するとCloudFormation は参照しているスタックを記録 * し被参照リソースが誤って削除さないようにガードする弱い参照動的参照は CloudFormation がスタックのデプロイ中に解決するが、参照しているスタックは記録しないCloudFormation の Parameter による値渡しも同様13Stack1TopicQueueOutputs:TopicXXXX:Value: !Ref 'TopicXXXX'Export:Name: TopicXXXXRefYAMLResources:QueueSub:Type: AWS::SNS::SubscriptionProperties:Protocol: sqsTopicArn: !ImportValue 'TopicXXXXRef'Endpoint: !GetAtt 'QueueYYYY.Arn'YAMLStack2Parameter StoreQueueResources:QueueSub:Type: AWS::SNS::SubscriptionProperties:Protocol: sqsTopicArn: '{{resolve:ssm:MyTopicArn:}}'Endpoint: !GetAtt 'QueueYYYY.Arn'YAMLStack2* $ aws cloudformation list-imports で確認可能→ 安全なため推奨されるがデプロイ順序の考慮が必要 → 被参照リソースを制約なく削除可能
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk!GetAtt作成・更新読み取りタグ付けap-northeast-1 us-east-1Producer Stack Consumer StackAWS CDK のクロスリージョン参照 (Preview)14v2.50.0 ~Parameter StoreAmazon CloudFrontApplication LoadBalancerExportReaderExportWriteraws-cdk:strong-ref:Consumer StackCloudFront のオリジンとして他のリージョンの ALB を参照する例BLEA のサンプルコード https://github.com/aws-samples/baseline-environment-on-aws/blob/main/usecases/blea-guest-ecs-app-sample/lib/construct/frontend.tsCDK が⾃動で作成!GetAttconst ecsapp = new BLEAEcsAppStack(app,'Dev-BLEAEcsApp', {env: { region: 'ap-northeast-1' },crossRegionReferences: true,});const frontend = newBLEAEcsAppFrontendStack(app,'Dev-BLEAEcsAppFrontend', {env: { region: 'us-east-1' },crossRegionReferences: true,alb: ecsapp.alb,});TypeScripthttps://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html#accessing-resources-in-a-different-stack-and-region提供側と消費側両⽅に指定が必要※ v2.79.0 現在CDK が⾃動的に Custom Resource とSSM Parameter Store を作成。クロススタック参照と同様に強い参照になる
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDK2. CDK App 外のリソースの参照15AWS CloudAWS CloudFormationStackConstruct Prepare Validate SynthetizeTopicTableSourcecodeCloudFormationTemplateCopy ofTemplateProps ofResourcesDeploy• ⼀部の L2 Construct に fromXXX という static method がある• fromXxx はリソースを⼀意に特定できる情報を渡して参照• fromLookup は CDK Toolkit が AWS SDK を呼び出してリソースを探しに⾏き、結果を cdk.context.json にキャッシュ• fromCfnXxx は L1 Construct から L2 を作るもので現状は 3つのリソースにのみ実装 *cloudformation_include で紹介• いずれも戻り値は Proxy Object (ITopic などの interface) でCloudFormation 管理下にならない = CDK から変更できない※ メソッドには対象リソース以外を変更できるものもある。ドキュメントをよく読もう︕参照先のリソースは管理しないconst topic = Topic.fromTopicArn(stack, 'Topic','arn:aws:sns:ap-northeast-1:123456789012:MyTopic');const queue = new Queue(stack, 'Queue');topic.addSubscription(new SqsSubscription(queue));TypeScriptconst vpc = Vpc.fromLookup(this, 'DefaultVpc', {isDefault: true});TypeScriptAPI 呼び出し(fromLookupのみ)
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDK3. SSM Parameter Store の参照16AWS CloudAWS CloudFormationStackConstruct Prepare Validate SynthetizeTopicTableSourcecodeCloudFormationTemplateCopy ofTemplateProps ofResourcesconst param1 = StringParameter.valueForStringParameter(stack, 'P1');const bucket = new Bucket(stack, 'Bucket1', {bucketName: param1,});TypeScript* https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#aws-ssm-parameter-typesCloudFormation Parameter のSSM Parameter Type*(valueForXxxParameter)"BucketName": {"Ref": "SsmParameterValuexxxxx"},"Tags": [{"Key": "Param2","Value": "param2"}, {"Key": "Param1","Value": { "Ref": "CdkConfParam1RefParameter" }TemplateDeployAPI 呼び出し&埋め込み(valueFromLookupのみ)valueFromLookup は取得した値を cdk.context.json にキャッシュする• ⼀貫性のあるデプロイを⾏うため、Git にコミットすることを推奨• キャッシュのクリアは cdk context --reset コマンドconst param2 = StringParameter.valueFromLookup(stack, 'P2');Tags.of(bucket).add('Param2', param2);TypeScript注意! valueFromLookup は解決済みの値を直接埋め込む
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDK4. SSM Secure String と Secrets Manager の参照17AWS CloudAWS CloudFormationStackConstruct Prepare Validate SynthetizeTopicTableSourcecodeCloudFormationTemplateCopy ofTemplateProps ofResources組み込み関数または動的参照で解決"UserName":"{{resolve:secretsmanager:CdkConfSecret2:SecretString:::}}","LoginProfile": {"Password": "{{resolve:ssm-secure:CdkConfSecret1}}"},Templateconst secure1 = SecretValue.ssmSecure('CdkConfSecret1');const secure2 = SecretValue.secretsManager('CdkConfSecret2');new User(stack, 'CdkConfUser1', {userName: secure2.toString(),password: secure1,});TypeScript• シークレットの参照には SecretValue クラスが便利 https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.SecretValue.html• Secrets Manager のシークレットはどこでも使えるが、SSM Secure String の動的参照は限られたリソースのプロパティでしか使えないことに注意 (CloudFormation の制約)https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html#template-parameters-dynamic-patterns-resourcesDeploy
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkパラメータ・シークレット参照の使い分け18const secure1 = SecretValue.ssmSecure('CdkConfSecret1');const secure2 = SecretValue.secretsManager('CdkConfSecret2');TypeScriptconst param1 = StringParameter.valueForStringParameter(stack,'P1');TypeScriptconst param1ref =StringParameter.fromStringParameterName(stack, 'P1Ref','P1');Tags.of(bucket).add('Param1', param1ref.stringValue);TypeScriptconst param2 = StringParameter.valueFromLookup(stack, 'P2');TypeScriptシークレットの値を使いたい• SSM Parameter Store (Secure String)• Secrets Manager平⽂のパラメータの値を使いたい• SSM Parameter Storeパラメータ・シークレットのリソースを参照したい• grant() するとき• リソースから値を受け取りたいとき• RDS の DatabaseSecret など Construct を使うときhttps://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_rds.DatabaseSecret.htmlSynth 時に値を解決して埋め込みたいVpc.ipAddresses など Validation フェーズでエラーになる場合は以下を参照https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ssm-readme.html#lookup-existing-parameters※ Synth 時に CDK Toolkit が解決※ 解決したコンテキスト値とテンプレートに埋め込まれたパラメータはキャッシュおよび保存されるためセキュリティに注意など※ スタックの更新時に CloudFormation が解決※ スタックの更新時に CloudFormation が解決※ スタックの更新時に CloudFormation が解決
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDKDive deep: CDK App Lifecycle• CDK App の役割はCloudAssembly を作成すること• CDK Toolkit の役割は CDK App のためにContext などの周辺環境を準備したりdiff の⽣成やデプロイなどの処理を⾏うこと• CDK App と CDK Toolkit は直接統合しない§ CDK App をコマンドで実⾏(別プロセス)§ Context は環境変数や JSON ファイルで渡す(⾔語⾮依存)• valueFromLookup などによって未解決の Context 値が参照されるとCDK App が複数回実⾏されることがある§ CDK App で SDK 呼び出しや副作⽤のある処理を書くとパフォーマンス劣化や冪等性、権限などの問題が出やすい19Construct Prepare Validate SynthetizeSourcecodeCloudFormationTemplateDeploy$ cdk synthCDK App の世界CDK Toolkit の世界Parse argvLoadpluginsSyhtnesize Validate① Context を環境変数とJSONファイルに保存③ 未解決の Context 値を報告④ 未解決の Context 値をSDK で解決して保存Loop② コマンド呼び出しで実⾏valueForLookup()
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDK5. CDK 実⾏環境でのパラメータの参照20AWS CloudAWS CloudFormationStackConstruct Prepare Validate SynthetizeTopicTableSourcecodeCloudFormationTemplateCopy ofTemplateProps ofResourcesコード上で解決外部のデータストア(SSM Parameter Store, Secrets Manager, データベース等)ではなくコードベースを管理するプロジェクトが主体的に決めるパラメータを扱う⽅法は主に以下• Git リポジトリ内の CDK の設定ファイル(cdk.json)• Git リポジトリ内のソースコード(TypeScript)に書き込み• Git リポジトリ内の独⾃の設定ファイル(JSON, YAML などをプログラムから読み込み)• 環境変数• Context (コマンドラインオプション `-c`, `--context` によるコンテキストの上書き)• CfnParameter (必要がない限り⾮推奨)Deploy
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkInfrastructure as Code (IaC) とパラメータの考え⽅決定論的であるべき• 再現可能で外部要因の影響がないことが理想IaC のコードは修正時に都度再コンパイルされる• アプリのコードと異なり、動的に振る舞いを変える必要がない• パラメータが変わったら明⽰的に再デプロイしたいコードの読みやすさと設計者の意図を重視• 過度な抽象化や条件分岐、ループを避ける• 外部のパラメータを取得してから実⾏したい場合も結果を Git にコミットしておくことで変化が明確に21Git リポジトリ = Single Source of TruthGit リポジトリを⾒ればインフラ構成がすべてわかる状態にする
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk© 2023, Amazon Web Services, Inc. or its affiliates.『インクルード』のカタチ22
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDK6. CloudFormation テンプレートのインクルード23AWS CloudAWS CloudFormationStackConstruct Prepare Validate SynthetizeTopicTableSourcecodeCloudFormationTemplateCopy ofTemplateProps ofResources// === AWS Config Conformance Pack ===// https://github.com/awslabs/aws-config-rules/tree/master/aws-config-conformance-packsnew CfnInclude(this, 'CfnControlTowerGuardralis', {templateFile: 'cfn/AWS-Control-Tower-Detective-Guardrails.yaml',});TypeScript• CloudFormation テンプレートを再利⽤• AWS やコミュニティが公開しているテンプレート• 組織内ですでに検証済みのテンプレート など• preserveLogicalIds: false (デフォルトは true)を指定することで論理IDの命名を CDK に任せられる• インクルードしたテンプレートで作成したリソースはgetResource() などでアクセス可能BLEA のコード https://github.com/aws-samples/baseline-environment-on-aws/blob/f10bcf1167977976b8129483b2e26c46aef4006e/usecases/blea-gov-base-standalone/lib/construct/detection.ts#L39Deploy
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDK6'. CloudFormation スタックを CDK に移⾏24AWS CloudAWS CloudFormationStackConstruct Prepare Validate SynthetizeTopicTableSourcecodeCloudFormationTemplateCopy ofTemplateProps ofResourcesDeployconst stack = new Stack(app, 'IAM-Sample');new CfnInclude(stack, 'IAM', {templateFile: 'cfn/IAM_Users_Groups_and_Policies.yaml',});TypeScript• デプロイ済みの CloudFormation スタックをCDK App の⼀部に含める• CfnInclude を⾏うスコープのスタック名を合わせる• 通常は Construct ID (new Stack() の第2引数) を既存のスタック名に合わせる• Stage 配下の場合はstackName プロパティを明⽰的に指定• cdk diff で Bootstrap 関連のパラメータや条件のみが追加されていることを確認例)IAM-Sample スタックがデプロイ済みの場合
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkCloudFormation のスタック名CloudFormation ではスタック名だけでスタックを識別している25$ aws cloudformation deploy --stack-name Stack1 --template-file stack1.yml$ aws cloudformation deploy --stack-name Stack2 --template-file stack2.ymlConsoleStack1 Stack2誤って別のテンプレートファイルをデプロイしてしまうと・・$ aws cloudformation deploy --stack-name Stack1 --template-file stack2.ymlConsoleそのテンプレートファイルの中⾝でスタックが更新される※ 変更セットを確認していれば気づくことができるCloudFormation をデプロイするときは⼿でスタック名を指定せずシェルスクリプトや Makefile などでスタック名を計算するとよいCDK でもスタック名を指定する際は注意が必要Stack1 Stack2
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk© 2023, Amazon Web Services, Inc. or its affiliates.『インポート』のカタチ26
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDK7. CloudFormation へのリソースのインポート27AWS CloudAWS CloudFormationStackConstruct Prepare Validate SynthetizeTopicTableSourcecodeCopy ofTemplateProps ofResourcesDeploy• 前提条件︓ テンプレートとリソースの設定はセット(テンプレートなしでインポートはできない)• 現在のリソースの状態と⼀致するテンプレートを⽤意してインポートを実施(コンソール or CLI)• cdk import コマンドで対話的にインポート可能(Preview)v2.20.0 ~(Preview)CloudFormationTemplate現在のリソースの状態とテンプレートが⼀致しなくてもインポートが成功するため、ドリフト検出が推奨されている
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk現在のリソースの状態とテンプレートに差異があると・・・28インポートしたリソースのドリフトを修正しようとしても更新動作が Replacement のプロパティは変更できない(再作成になる)MODIFIED
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkCDK でのリソースインポートの⼿順例29Former2 で L1 Construct を⽣成cdk importドリフトがないことを確認Snapshot test を作成L2 Construct にリファクタリングFormer2 https://github.com/iann0036/former2物理名を削除して利⽤
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkAWS CDKいろいろな差分の検出30AWS CloudAWS CloudFormationStackConstruct Prepare Validate SynthetizeTopicTableSourcecodeCloudFormationTemplateCopy ofTemplateProps ofResourcesDeploySnapshot(Saved template)CloudFormation 変更セットCloudFormation 変更セット• 新しいテンプレートをアップロードし保存されているスタックリソースの状態と⽐較• UpdateStack が呼ばれると以前の変更セットは削除cdk diff コマンド• 合成したテンプレートとすでにデプロイ済みのテンプレートを⽐較• リソースの置換が起こるかどうかも仕様から確認cdk diffdownloadthe templateSnapshot testCDK のスナップショットテスト• 合成したテンプレートと以前のテンプレート(スナップショット)を⽐較CloudFormation ドリフト検出CloudFormation ドリフト検出• 保存されているスタックリソースの状態と現在のリソースの状態を⽐較
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkCloudFormation から CDK への移⾏⽅法の使い分けデプロイ済みのスタックを維持して移⾏移⾏⼿順1. CfnInclude で既存のスタック名と合わせてデプロイ2. Snapshot test を作成・実⾏ポイント• デプロイ済みのスタックを変更しないため稼働中のアプリに影響を与えづらい• スタック構成の変更や L2 Construct へのリファクタなどを段階的に⾏える• L2 Construct にリファクタする場合overrideLogicalId() で論理 ID を維持するデプロイ済みのスタックを削除して移⾏移⾏⼿順1. CloudFormation で DeletionPolicy: Retain を設定2. CloudFormation でスタックを削除3. CDK でスタックを作成(他のリソースを先に作成)4. cdk importポイント• ステートフルなリソースのみインポート対象にする* インポート可能なリソースの⼀覧https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html• 既存リソースの⼀部だけを利⽤したい場合に有効31CFnStackFunction Topic TableCFnStackFunction Topic Table Topic TableCDKStackFunction Topic TableCfnInclude
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkリファクタリング時の考慮点• スタックにドリフトがないことが⼤前提• cdk diff とスナップショットテストを活⽤する• ステートレスなリソースは再作成できないか考える• 変更を⼩さくして何度もデプロイする• 2 フェーズデプロイで安全に移⾏する32Amazon Builders' Libraryデプロイ時におけるロールバックの安全性の確保https://aws.amazon.com/jp/builders-library/ensuring-rollback-safety-during-deployments/
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk© 2023, Amazon Web Services, Inc. or its affiliates.まとめ33
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdkコードと動作をイメージできましたか︖34イベントは他のサービスのSNS Topic に流れてくるから参照してサブスクライブしてねDynamoDB テーブルは⼿動で作ったからインポートしといてVPC 部分は昔のCloudFormation テンプレートをインクルードして再利⽤しようCDK が得意な先輩あなたは、先輩から Amazon ECS でアプリの作成を依頼されましたTopicTopic.fromTopicArnTable$ cdk importVPCCfnIncludeECS ClusterServiceStack作るべきスタックはこの範囲👍
実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜© 2023, Amazon Web Services, Inc. or its affiliates.< #jawsug_cdk© 2023, Amazon Web Services, Inc. or its affiliates.Thank you!Kono, Kenji@konokenjhttps://twitter.com/konokenjAWS CDK のアップデート情報をつぶやいています#cdk_releases