$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

    View Slide

  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
    けんじ
    • サウナ
    • ⾃作キーボード
    • マンガ

    View Slide

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

    View Slide

  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
    🤔

    View Slide

  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

    View Slide

  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

    View Slide

  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関数のコード
    • コンテナイメージ
    • ファイル など
    アセットのデプロイ
    テンプレートと設定をスタックとして管理

    View Slide

  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

    View Slide

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

    View Slide

  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 が返る

    View Slide

  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

    View Slide

  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 で確認可能
    → 安全なため推奨されるがデプロイ順序の考慮が必要 → 被参照リソースを制約なく削除可能

    View Slide

  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 を作成。
    クロススタック参照と同様に強い参照になる

    View Slide

  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のみ)

    View Slide

  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 は
    解決済みの値を直接埋め込む

    View Slide

  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

    View Slide

  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 が解決

    View Slide

  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()

    View Slide

  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

    View Slide

  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 リポジトリを⾒れば
    インフラ構成がすべてわかる状態にする

    View Slide

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

    View Slide

  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

    View Slide

  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 スタックがデプロイ済みの場合

    View Slide

  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

    View Slide

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

    View Slide

  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
    現在のリソースの状態とテンプレートが⼀致しなくても
    インポートが成功するため、ドリフト検出が推奨されている

    View Slide

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

    View Slide

  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
    物理名を削除して利⽤

    View Slide

  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 ドリフト検出
    • 保存されているスタックリソースの状態と
    現在のリソースの状態を⽐較

    View Slide

  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

    View Slide

  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/

    View Slide

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

    View Slide

  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
    作るべきスタックは
    この範囲
    👍

    View Slide

  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

    View Slide