$30 off During Our Annual Pro Sale. View Details »

実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜

実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜

AWS CDKにおける参照にはさまざまな形があります。ConstructやStackをまたいだ参照、クロスリージョンリファレンス、AWSアカウント内のリソースの参照などです。このセッションではCDKにおけるさまざまな参照の仕組みを整理し、意図の明らかなコードを書くための使い分け方法を検討します。

AWS CDK Conference Japan 2023 の登壇資料です。

※ 資料内のリンクにアクセスしたい場合は PDF をダウンロードしてご利用ください。

Kenji Kono

May 20, 2023
Tweet

More Decks by Kenji Kono

Other Decks in Programming

Transcript

  1. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk © 2023, Amazon Web Services, Inc. or its affiliates. 実践 AWS CDK Kono, 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 3 Solutions Architect Amazon Web Services Japan G.K. 2023/5/20
  2. 実践 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 けんじ • サウナ • ⾃作キーボード • マンガ
  3. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 ゴール • AWS CDK と AWS CloudFormation の動きをイメージしながら コードを書けるようにすること 想定聴講者 • AWS CDK をディープに使いこなしたい開発者 • AWS CDK の裏側で何が起こっているか興味がある⽅ 3
  4. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk コードと動作をイメージできますか︖ 5 イベントは他のサービスの SNS Topic に流れてくるから 参照してサブスクライブしてね DynamoDB テーブルは ⼿動で作ったから インポートしといて VPC 部分は昔の CloudFormation テンプレートを インクルードして再利⽤しよう CDK が得意な先輩 あなたは、先輩から Amazon ECS でアプリの作成を依頼されました Topic VPC Table ECS Cluster Service 🤔
  5. 実践 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
  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
  7. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK のしくみ プログラミング⾔語で インフラ構成を定義 開発者 TypeScript JavaScript Python Java .NET Go 各⾔語のコンストラクトライブラリを利⽤ AWS CDK Toolkit (CLI) CloudFormation テンプレートに変換 アセットのバンドルとデプロイ $ cdk deploy Node.js Node.js のコマンドラインツール クラウドリソース ⽬的の状態に収束 API 呼び出し AWS CloudFormation テンプレートに従い リソースを⽬的の状態にする • S3 バケットがなかったら作成 • 状態が違っていたら更新 • 状態が同じなら何もしない etc. テンプレートに変換 • Lambda関数のコード • コンテナイメージ • ファイル など アセットのデプロイ テンプレートと設定をスタックとして管理
  8. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK と AWS CloudFormation の関わり 9 AWS Cloud Topic Table 現実世界 • さまざまな⼿段で 変更されうる • CloudFormation で 管理されていない ものもある AWS CloudFormation Stack Copy of Template IaC サービスの世界 • ユーザーの指⽰を テンプレートとして 受け取って API を呼び出し • スタックに永続化 • テンプレートのコピー • 管理しているリソースの設定 • Export / Import された値 Props of Resources * Asset はここでは図⽰していません AWS CDK Construct Prepare Validate Synthetize Source code CloudFormation Template プログラミングの世界 • パラメータを含めすべて Git で管理される決定論的な世界 • CloudFormation テンプレートに ロジックを含めることはできない * • 未確定な値は CDK または別のプログラムで解決するか CloudFormation の機能で渡す必要がある * ここでは任意の処理を組み込めるわけではないことを指す。 Fn::If や Fn::FindInMap などで単純なロジックは記述可能。 Deploy
  9. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk © 2023, Amazon Web Services, Inc. or its affiliates. 『参照』のカタチ 10
  10. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK 1. CDK App 内のリソースの参照 11 AWS Cloud AWS CloudFormation Stack Construct Prepare Validate Synthetize Topic Table Source code CloudFormation Template Copy of Template Props of Resources const 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, }); TypeScript https://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" ]} Template CDK アプリのコード内でリソースを参照すると CloudFormation の組み込み関数に変換される ※ CDK App 内で値にアクセスすると Token が返る
  11. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk 参照するリソースがどこにあるかで動作が変わる 12 App Stage Stack Construct Construct Stack Construct Stage Stack Construct Region A Region B 1 2 3 4 1 2 3 4 同じ 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
  12. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk CloudFormation における強い参照と弱い参照 強い参照 Export した値を !ImportValue で参照すると CloudFormation は参照しているスタックを記録 * し 被参照リソースが誤って削除さないようにガードする 弱い参照 動的参照は CloudFormation がスタックのデプロイ中に 解決するが、参照しているスタックは記録しない CloudFormation の Parameter による値渡しも同様 13 Stack1 Topic Queue Outputs: TopicXXXX: Value: !Ref 'TopicXXXX' Export: Name: TopicXXXXRef YAML Resources: QueueSub: Type: AWS::SNS::Subscription Properties: Protocol: sqs TopicArn: !ImportValue 'TopicXXXXRef' Endpoint: !GetAtt 'QueueYYYY.Arn' YAML Stack2 Parameter Store Queue Resources: QueueSub: Type: AWS::SNS::Subscription Properties: Protocol: sqs TopicArn: '{{resolve:ssm:MyTopicArn:}}' Endpoint: !GetAtt 'QueueYYYY.Arn' YAML Stack2 * $ aws cloudformation list-imports で確認可能 → 安全なため推奨されるがデプロイ順序の考慮が必要 → 被参照リソースを制約なく削除可能
  13. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk !GetAtt 作成・更新 読み取り タグ付け ap-northeast-1 us-east-1 Producer Stack Consumer Stack AWS CDK のクロスリージョン参照 (Preview) 14 v2.50.0 ~ Parameter Store Amazon CloudFront Application Load Balancer ExportReader ExportWriter aws-cdk:strong-ref: Consumer Stack CloudFront のオリジンとして他のリージョンの ALB を参照する例 BLEA のサンプルコード https://github.com/aws-samples/baseline-environment-on-aws/blob/main/usecases/blea-guest-ecs-app-sample/lib/construct/frontend.ts CDK が⾃動で作成 !GetAtt const ecsapp = new BLEAEcsAppStack(app, 'Dev-BLEAEcsApp', { env: { region: 'ap-northeast-1' }, crossRegionReferences: true, }); const frontend = new BLEAEcsAppFrontendStack(app, 'Dev-BLEAEcsAppFrontend', { env: { region: 'us-east-1' }, crossRegionReferences: true, alb: ecsapp.alb, }); TypeScript https://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 を作成。 クロススタック参照と同様に強い参照になる
  14. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK 2. CDK App 外のリソースの参照 15 AWS Cloud AWS CloudFormation Stack Construct Prepare Validate Synthetize Topic Table Source code CloudFormation Template Copy of Template Props of Resources Deploy • ⼀部の 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)); TypeScript const vpc = Vpc.fromLookup(this, 'DefaultVpc', { isDefault: true }); TypeScript API 呼び出し (fromLookupのみ)
  15. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK 3. SSM Parameter Store の参照 16 AWS Cloud AWS CloudFormation Stack Construct Prepare Validate Synthetize Topic Table Source code CloudFormation Template Copy of Template Props of Resources const 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-types CloudFormation Parameter の SSM Parameter Type* (valueForXxxParameter) "BucketName": { "Ref": "SsmParameterValuexxxxx" }, "Tags": [ { "Key": "Param2", "Value": "param2" }, { "Key": "Param1", "Value": { "Ref": "CdkConfParam1RefParameter" } Template Deploy API 呼び出し&埋め込み (valueFromLookupのみ) valueFromLookup は取得した値を cdk.context.json にキャッシュする • ⼀貫性のあるデプロイを⾏うため、Git にコミットすることを推奨 • キャッシュのクリアは cdk context --reset コマンド const param2 = StringParameter.valueFromLookup(stack, 'P2'); Tags.of(bucket).add('Param2', param2); TypeScript 注意! valueFromLookup は 解決済みの値を直接埋め込む
  16. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK 4. SSM Secure String と Secrets Manager の参照 17 AWS Cloud AWS CloudFormation Stack Construct Prepare Validate Synthetize Topic Table Source code CloudFormation Template Copy of Template Props of Resources 組み込み関数または 動的参照で解決 "UserName": "{{resolve:secretsmanager:CdkConfSecret2:SecretString:::}}", "LoginProfile": { "Password": "{{resolve:ssm-secure:CdkConfSecret1}}" }, Template const 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-resources Deploy
  17. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk パラメータ・シークレット参照の使い分け 18 const secure1 = SecretValue.ssmSecure('CdkConfSecret1'); const secure2 = SecretValue.secretsManager('CdkConfSecret2'); TypeScript const param1 = StringParameter.valueForStringParameter(stack, 'P1'); TypeScript const param1ref = StringParameter.fromStringParameterName(stack, 'P1Ref', 'P1'); Tags.of(bucket).add('Param1', param1ref.stringValue); TypeScript const 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.html Synth 時に値を解決して埋め込みたい 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 が解決
  18. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK Dive 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 呼び出しや副作⽤のある処理を書くと パフォーマンス劣化や冪等性、権限などの問題が出やすい 19 Construct Prepare Validate Synthetize Source code CloudFormation Template Deploy $ cdk synth CDK App の世界 CDK Toolkit の世界 Parse argv Load plugins Syhtnesize Validate ① Context を環境変数と JSONファイルに保存 ③ 未解決の Context 値を報告 ④ 未解決の Context 値を SDK で解決して保存 Loop ② コマンド呼び出しで実⾏ valueForLookup()
  19. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK 5. CDK 実⾏環境でのパラメータの参照 20 AWS Cloud AWS CloudFormation Stack Construct Prepare Validate Synthetize Topic Table Source code CloudFormation Template Copy of Template Props of Resources コード上で解決 外部のデータストア(SSM Parameter Store, Secrets Manager, データベース等)ではなく コードベースを管理するプロジェクトが主体的に決めるパラメータを扱う⽅法は主に以下 • Git リポジトリ内の CDK の設定ファイル(cdk.json) • Git リポジトリ内のソースコード(TypeScript)に書き込み • Git リポジトリ内の独⾃の設定ファイル(JSON, YAML などをプログラムから読み込み) • 環境変数 • Context (コマンドラインオプション `-c`, `--context` によるコンテキストの上書き) • CfnParameter (必要がない限り⾮推奨) Deploy
  20. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk Infrastructure as Code (IaC) とパラメータの考え⽅ 決定論的であるべき • 再現可能で外部要因の影響がないことが理想 IaC のコードは修正時に都度再コンパイルされる • アプリのコードと異なり、 動的に振る舞いを変える必要がない • パラメータが変わったら明⽰的に再デプロイしたい コードの読みやすさと設計者の意図を重視 • 過度な抽象化や条件分岐、ループを避ける • 外部のパラメータを取得してから実⾏したい場合も 結果を Git にコミットしておくことで変化が明確に 21 Git リポジトリ = Single Source of Truth Git リポジトリを⾒れば インフラ構成がすべてわかる状態にする
  21. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk © 2023, Amazon Web Services, Inc. or its affiliates. 『インクルード』のカタチ 22
  22. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK 6. CloudFormation テンプレートのインクルード 23 AWS Cloud AWS CloudFormation Stack Construct Prepare Validate Synthetize Topic Table Source code CloudFormation Template Copy of Template Props of Resources // === AWS Config Conformance Pack === // https://github.com/awslabs/aws-config- rules/tree/master/aws-config-conformance-packs new 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#L39 Deploy
  23. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK 6'. CloudFormation スタックを CDK に移⾏ 24 AWS Cloud AWS CloudFormation Stack Construct Prepare Validate Synthetize Topic Table Source code CloudFormation Template Copy of Template Props of Resources Deploy const 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 スタックがデプロイ済みの場合
  24. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk CloudFormation のスタック名 CloudFormation ではスタック名だけでスタックを識別している 25 $ aws cloudformation deploy --stack-name Stack1 --template-file stack1.yml $ aws cloudformation deploy --stack-name Stack2 --template-file stack2.yml Console Stack1 Stack2 誤って別のテンプレートファイルをデプロイしてしまうと・・ $ aws cloudformation deploy --stack-name Stack1 --template-file stack2.yml Console そのテンプレートファイルの中⾝でスタックが更新される ※ 変更セットを確認していれば気づくことができる CloudFormation をデプロイするときは⼿でスタック名を指定せず シェルスクリプトや Makefile などでスタック名を計算するとよい CDK でもスタック名を指定する際は注意が必要 Stack1 Stack2
  25. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk © 2023, Amazon Web Services, Inc. or its affiliates. 『インポート』のカタチ 26
  26. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK 7. CloudFormation へのリソースのインポート 27 AWS Cloud AWS CloudFormation Stack Construct Prepare Validate Synthetize Topic Table Source code Copy of Template Props of Resources Deploy • 前提条件︓ テンプレートとリソースの設定はセット (テンプレートなしでインポートはできない) • 現在のリソースの状態と⼀致するテンプレートを ⽤意してインポートを実施(コンソール or CLI) • cdk import コマンドで対話的にインポート可能 (Preview) v2.20.0 ~ (Preview) CloudFormation Template 現在のリソースの状態とテンプレートが⼀致しなくても インポートが成功するため、ドリフト検出が推奨されている
  27. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk 現在のリソースの状態とテンプレートに差異があると・・・ 28 インポートしたリソースのドリフトを修正しようとしても 更新動作が Replacement のプロパティは変更できない (再作成になる) MODIFIED
  28. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk CDK でのリソースインポートの⼿順例 29 Former2 で L1 Construct を⽣成 cdk import ドリフトがないことを確認 Snapshot test を作成 L2 Construct にリファクタリング Former2 https://github.com/iann0036/former2 物理名を削除して利⽤
  29. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk AWS CDK いろいろな差分の検出 30 AWS Cloud AWS CloudFormation Stack Construct Prepare Validate Synthetize Topic Table Source code CloudFormation Template Copy of Template Props of Resources Deploy Snapshot (Saved template) CloudFormation 変更セット CloudFormation 変更セット • 新しいテンプレートをアップロードし 保存されているスタックリソースの状態と⽐較 • UpdateStack が呼ばれると以前の変更セットは削除 cdk diff コマンド • 合成したテンプレートと すでにデプロイ済みのテンプレートを⽐較 • リソースの置換が起こるかどうかも仕様から確認 cdk diff download the template Snapshot test CDK のスナップショットテスト • 合成したテンプレートと 以前のテンプレート(スナップショット)を⽐較 CloudFormation ドリフト検出 CloudFormation ドリフト検出 • 保存されているスタックリソースの状態と 現在のリソースの状態を⽐較
  30. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk CloudFormation から 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 • 既存リソースの⼀部だけを利⽤したい場合に有効 31 CFnStack Function Topic Table CFnStack Function Topic Table Topic Table CDKStack Function Topic Table CfnInclude
  31. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk リファクタリング時の考慮点 • スタックにドリフトがないことが⼤前提 • cdk diff とスナップショットテストを活⽤する • ステートレスなリソースは再作成できないか考える • 変更を⼩さくして何度もデプロイする • 2 フェーズデプロイで安全に移⾏する 32 Amazon Builders' Library デプロイ時におけるロールバックの安全性の確保 https://aws.amazon.com/jp/builders-library/ensuring-rollback-safety-during-deployments/
  32. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk © 2023, Amazon Web Services, Inc. or its affiliates. まとめ 33
  33. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk コードと動作をイメージできましたか︖ 34 イベントは他のサービスの SNS Topic に流れてくるから 参照してサブスクライブしてね DynamoDB テーブルは ⼿動で作ったから インポートしといて VPC 部分は昔の CloudFormation テンプレートを インクルードして再利⽤しよう CDK が得意な先輩 あなたは、先輩から Amazon ECS でアプリの作成を依頼されました Topic Topic.fromTopicArn Table $ cdk import VPC CfnInclude ECS Cluster Service Stack 作るべきスタックは この範囲 👍
  34. 実践 AWS CDK 〜 いろいろな参照のカタチと使い分け 〜 © 2023, Amazon Web

    Services, Inc. or its affiliates. < #jawsug_cdk © 2023, Amazon Web Services, Inc. or its affiliates. Thank you! Kono, Kenji @konokenj https://twitter.com/konokenj AWS CDK のアップデート情報を つぶやいています #cdk_releases