Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

CDK使いがAWS Adapter for CDKTFでTerraformに入門した話

watany
August 25, 2022

CDK使いがAWS Adapter for CDKTFでTerraformに入門した話

2022/08/25のHashiTalks: Japanでの登壇スライドです。

watany

August 25, 2022
Tweet

More Decks by watany

Other Decks in Programming

Transcript

  1. HashiTalks: Japan CDK 使いが AWS Adapter for CDKTF で Terraform

    に入門した話 2022/08/25 Watanabe Yohei 1
  2. Agendae 1. AWS Adaptor とその周辺 2. CDK 使いが AWS Adaptor

    へ挑む 3. Preview 時点の注意点 4. まとめ 2
  3. About me Watanabe Yohei (Twitter: _@watany) Company Name: NTT TechnoCross

    Corporation Role: AWS Architect, Instructor, CCoE AWS, CDK 2022 APN ALL AWS Certifications Engineers AWS Community Builder(Cloud Operations) Contributer (AWS CDK) 3
  4. 1. AWS Adaptor とその周辺 2. CDK 使いが AWS Adaptor へ挑む

    3. Preview 時点の注意点 4. まとめ 5
  5. What is CDK Family? AWS Cloud Development Kit (以降 CDK)

    プログラミング言語でクラウドリソースを定義 ”zzz.yaml” → ”aaa.ts, bbb.py, ccc.go” AWS CDK Family の誕生 (2019 ~ 2020) CDK for Terraform 2020/7 alpha release (以降 CDKTF) 以降、CDKTF cdk8s 2020/5 bata release k8s の Manifest をプログラミング言語で定義する技術 アーリーアダプターからマジョリティへ (2021 ~ 2022) CDK8s GA (2021/10) CDK 2.0 GA (2021/12) CDKTF GA (2022/08/01) ←New! 6
  6. 私と IaC AWS 主体の案件が多く、AWS CloudFormation(以下 CFn)が大半 AWS CloudFormation: AWS の純正

    IaC サービス Terraform が気になるが踏み出しきれない Terraform にも向き合いたい気持ちの中、なぜか AWS CDK にハマってしまう。 案件で使える部分から CFn を置き換え 登壇などで事例共有 そんな中、CDKTF の登場。 もしかして CDK(& TypeScript)を覚えれば、様々な IaC を使いこなせる!? 7
  7. CFn to CDK のモチベーション 1. 手続き型言語の表現力 型システム, 繰り返し文, 配列, etc...

    動的なロジックは CDK 、静的な状態管理は 生成した CFn テンプレート。と分離できるのもメリット。 2. 使い慣れた言語でのエコシステムの活用 IDE Support アプリケーション/スクリプト開発とのスイッチングコストの軽減 3. リソース定義の抽象化 頻出設定を Default 値として、必要な設定だけを記述する L2 Construct e.g. VPC, EKS, 8
  8. Terraform を CDK 化するメリット? 1. 手続き型言語の表現力 HCL が使い慣れてるなら…… 2. 使い慣れた言語でのエコシステムの活用

    Formatter や Linter はありそう。 IDE サポートをどこまで欲するか 3. リソース定義の抽象化 CDKTF は L1 Constructs。抽象度は Terraform と同等 AWS CDK の L2,L3 Constructs, cdk8s の、cdk8s+があれば話が変わる CDKTF には AWS Adaptor for CDKTF があるらしい! 今回実施 9
  9. 1. AWS Adaptor とその周辺 2. CDK 使いが AWS Adaptor へ挑む

    3. Preview 時点の注意点 4. まとめ 10
  10. 11

  11. AWS Adaptor CDKTF から AWS CDK Construct を扱う ためのモジュール。 2022/8

    現在は technical preview Only TypeScript 生成されるテンプレートは JSON 形式 ≠ プログラミング言語で HCL を書く 技術 本セッションの下線部は誤り 12
  12. 各種用語の整理 複数の「Terraform to AWS」で混乱するので整理 Terraform Terraform AWS Provider CDKTF Terraform

    CDK aws Provider(@cdktf/provider-aws) import { AwsProvider } from "./.gen/providers/aws"; new AwsProvider(this, "aws", { region: "us-west-2" }); AWS Adaptor (@cdktf/aws-cdk) import { AwsTerraformAdapter, AwsProvider } from "@cdktf/aws-cdk"; new AwsProvider(this, "aws", { region: "us-west-2" }); const awsAdapter = new AwsTerraformAdapter(this, "adapter"); AWS Adaptor の AwsProvider クラスは provider-aws と同等 13
  13. VPC Public subnet Public subnet Public subnet Private subnet Private

    subnet Private subnet CloudFormation CDK CDKTF で表現したいリソース Amazon VPC 3 Availability Zone, VPC, Subnet, NAT Gateway, NACL, IGW 15
  14. Sample: CDKTF + AWS Adaptor import { Construct } from

    "constructs"; import { App, TerraformStack } from "cdktf"; import { AwsTerraformAdapter, AwsProvider } from "@cdktf/aws-cdk"; import * as ec2 from "aws-cdk-lib/aws-ec2"; export class MyStack extends TerraformStack { constructor(scope: Construct, id: string) { super(scope, id); new AwsProvider(this, "aws", { region: "ap-northeast-1" }); const awsAdapter = new AwsTerraformAdapter(this, "adapter"); const adaptorVpc = new ec2.Vpc(awsAdapter, "aws-adaptor-vpc", { maxAzs: 3, }); } } 16
  15. Sample: AWS CDK import { Construct } from "constructs"; import

    { Stack, StackProps } from "aws-cdk-lib"; import * as ec2 from "aws-cdk-lib/aws-ec2"; export class CdkStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const adaptorVpc = new ec2.Vpc(this, "aws-adaptor-vpc", { maxAzs: 3, }); } } 17
  16. 1. AWS Adaptor とその周辺 2. CDK 使いが AWS Adaptor へ挑む

    3. Preview 時点の注意点 4. まとめ 19
  17. Case A 前述のサンプルへ IAM:User を 3 つ足したい場合 CDK の感覚で、下のように追記すると……? for

    (const n of [1, 2, 3]) { new iam.User(awsAdapter, `aws-adaptor-User-${n}`); } 実行時にエラーが Error: Unsupported resource Type AWS::IAM::User. There is no custom mapping registered for AWS::IAM::User and the AWS CloudControl API does not seem to support it yet. 20
  18. Error Message の解析 1. There is no custom mapping registered

    for AWS::IAM::User custom mapping に関連する記述はなし(後述) 2. the AWS CloudControl API does not seem to support it yet. src/aws/iam/data-aws-iam-user.ts は存在しているが、 CDKTF-Terraform 連携用途 AWS Adaptor-CFn 連携は src/awscc/supportedTypes.ts が関係?(右図) 内容は AWS Cloud Control API の対応リソースと同等。 両者ともに AWS::IAM::User は未対応(図:右下) 2.は AWS のアップデートを待つしかなさそうなので、1.の対応が必要 21
  19. Manual Mappings Manual Mappings(手動マッピング)機能 CloudFormation と Terraform Provider のスキーマを対応付ける設 定値を定義

    本機能は未検証 右図は公式サンプル (DynamoDB) pros: AWS CDK のように L2Construct 未実装部でもユーザ側 でカスタマイズ可能 cons: Mapping の分、AWS CDK よ りも記述量は多め 22
  20. rule rule rule rule = = = = new new

    new new Rule Rule Rule Rule(awsAdapter awsAdapter awsAdapter awsAdapter, "rule", { schedule schedule schedule schedule schedule: Schedule Schedule Schedule Schedule.rate rate rate rate rate(Duration Duration Duration Duration.days days days days days(1)), }); const const const const queue queue queue queue queue = = = = new new new new Queue Queue Queue Queue(awsAdapter awsAdapter awsAdapter awsAdapter, "Queue", {}); rule rule rule rule.addTarget addTarget addTarget addTarget addTarget(new new new new targets targets targets targets.SqsQueue SqsQueue SqsQueue SqsQueue SqsQueue(queue queue queue queue)); Case b 開発中特有の課題がありそう 1. チュートリアルを参考に Lambda 作成を試みると失敗 Terraform → CFn へスキーマ変換するが失敗? error parsing CloudFormation Resource Schema JSON: loading JSON Schema 2. 連携系 EventBridge → SQS のような 2 つ以上のリソースのアク セス設定を加えると軒並み失敗する…… 対向 I/F の Cloud Control API が未対応なため AWS::SQS::QueuePolicy が API の対象外 3. cdktf deploy 後に、変更前のリソースを含む error が リソース状態(tfstate)周りの不整合の様子 Adaptor 特有ではなく、Terraform, CDKTF のお作法 の問題? 23
  21. Appendix. 既知の課題 公式サイトの私訳(原文は右図) Terraform の関数を CDK Construct の引数に渡すのはサポート外 AWS CDK

    の以下はサポート外 Constructs: App, Stack, nested Stack Assets, Aspects, Annotations CloudFormation の以下はサポート 外 Transforms, Parameters, Mappings, and Includes. 24
  22. 1. AWS Adaptor とその周辺 2. CDK 使いが AWS Adaptor へ挑む

    3. Preview 時点の注意点 4. まとめ 25
  23. まとめ AWS Adaptor は AWS CDK の感覚で Terraform を扱えるプロダクト。 マルチクラウドと

    AWS 最適化のいいとこどり 現時点で「つかってみた」以上に扱うには CDKTF, Manual Mapping との併用が必須 AWS の CDK サンプルをそのままリメイク、は厳しい。 未開発部分だけでなく Cloud Control API の制約もある点に注意 待ちきれない人は Contribute して AWS Adaptor を盛り上げていきましょう! 26