Slide 1

Slide 1 text

HashiTalks: Japan CDK 使いが AWS Adapter for CDKTF で Terraform に入門した話 2022/08/25 Watanabe Yohei 1

Slide 2

Slide 2 text

Agendae 1. AWS Adaptor とその周辺 2. CDK 使いが AWS Adaptor へ挑む 3. Preview 時点の注意点 4. まとめ 2

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

注 AWS CDK ユーザ目線の話です Terraform 初心者 AWS Adaptor: v0.5.2 時点 Latest: v0.6.0 (2022/8/24) 4

Slide 5

Slide 5 text

1. AWS Adaptor とその周辺 2. CDK 使いが AWS Adaptor へ挑む 3. Preview 時点の注意点 4. まとめ 5

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

私と IaC AWS 主体の案件が多く、AWS CloudFormation(以下 CFn)が大半 AWS CloudFormation: AWS の純正 IaC サービス Terraform が気になるが踏み出しきれない Terraform にも向き合いたい気持ちの中、なぜか AWS CDK にハマってしまう。 案件で使える部分から CFn を置き換え 登壇などで事例共有 そんな中、CDKTF の登場。 もしかして CDK(& TypeScript)を覚えれば、様々な IaC を使いこなせる!? 7

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

1. AWS Adaptor とその周辺 2. CDK 使いが AWS Adaptor へ挑む 3. Preview 時点の注意点 4. まとめ 10

Slide 11

Slide 11 text

11

Slide 12

Slide 12 text

AWS Adaptor CDKTF から AWS CDK Construct を扱う ためのモジュール。 2022/8 現在は technical preview Only TypeScript 生成されるテンプレートは JSON 形式 ≠ プログラミング言語で HCL を書く 技術 本セッションの下線部は誤り 12

Slide 13

Slide 13 text

各種用語の整理 複数の「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

Slide 14

Slide 14 text

いかがでしたか? 従来の CDK User には、既存の Constructs を流用できるメリットはわかりやすい Terraform, CDKTF ユーザには正直よくわからないのでは 次頁以降でサンプルを紹介 14

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

すごい! CDK ユーザ的には、ほぼ学習ゼロで Terraform の仕組みを扱える。 Terraform ユーザはマルチクラウド運用 + CDK 本家の抽象リソースも扱える。 といいつつ、動作させるまでが大変でした 実際使ってみてわかった制約も共有します。 18

Slide 19

Slide 19 text

1. AWS Adaptor とその周辺 2. CDK 使いが AWS Adaptor へ挑む 3. Preview 時点の注意点 4. まとめ 19

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Manual Mappings Manual Mappings(手動マッピング)機能 CloudFormation と Terraform Provider のスキーマを対応付ける設 定値を定義 本機能は未検証 右図は公式サンプル (DynamoDB) pros: AWS CDK のように L2Construct 未実装部でもユーザ側 でカスタマイズ可能 cons: Mapping の分、AWS CDK よ りも記述量は多め 22

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Appendix. 既知の課題 公式サイトの私訳(原文は右図) Terraform の関数を CDK Construct の引数に渡すのはサポート外 AWS CDK の以下はサポート外 Constructs: App, Stack, nested Stack Assets, Aspects, Annotations CloudFormation の以下はサポート 外 Transforms, Parameters, Mappings, and Includes. 24

Slide 25

Slide 25 text

1. AWS Adaptor とその周辺 2. CDK 使いが AWS Adaptor へ挑む 3. Preview 時点の注意点 4. まとめ 25

Slide 26

Slide 26 text

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