Slide 1

Slide 1 text

CDKTF ではじめる マルチクラウド IaC NES Sapporo Tech Brewery 2024/9/26 渡辺 隼人

Slide 2

Slide 2 text

自己紹介 ● 渡辺 隼人 ● 株式会社サーバーワークス ● 札幌在住 2 年目 ● 最近は Remix 💿 にお熱

Slide 3

Slide 3 text

目次 ● 本日のゴール ● CDKTF とは ● 僕の考える CDKTF の魅力 ● サンプル実装で考える ● まとめ

Slide 4

Slide 4 text

本日のゴール ● CDKTF の雰囲気をなんとなく感じる ● 本日のスコープ外 ○ プロダクションレベルの CDKTF の運用

Slide 5

Slide 5 text

CDKTF とは ● CDK for Terraform (Cloud Development Kit for Terraform) ● TypeScript, Python, Java, C#, Go でインフラストラクチャの定義が出来る ● HCL の学習なしで Terraform エコシステムを利用可能 ● AWS CDK のように DSL を用いた IaC と比べ以下の特徴があります ○ コンストラクトの概念による抽象度の高いインフラストラクチャ定義 ○ 再利用できるインフラストラクチャのコンポーネント化 ○ など...

Slide 6

Slide 6 text

僕の考える CDKTF の魅力 ● マルチクラウドに対応できる ○ 最近 Vercel, Supabase, Cloudflare などを使いたいケース増えてきたと感じてます ● インフラストラクチャとアプリケーションの垣根を超えるコラボレーション ○ インフラストラクチャとアプリケーションの開発言語が統一されるのは Good ○ マネージドサービスの採用などによりインフラストラクチャにもビジネスロジックの責務が与えられる と感じています ● ソフトウェアエンジニアチームを作る手段となる ○ エンジニアを役割 (インフラストラクチャ・アプリケーション ) で分けない ○ チームのつながりを Infrastructure as Codeでデザインする で⾼野さんもお話されていました ● なんかかっこいい

Slide 7

Slide 7 text

サンプル実装で考える ● GitHub - hashicorp/learn-cdktf-assets-stacks-lambda ● AWS Lambda 関数を Amazon API Gateway で公開するサンプルコードです

Slide 8

Slide 8 text

LambdaStack の詳細 1/3 // 実行ファイルをホストする S3 バケットの作成 const bucket = new aws.s3Bucket.S3Bucket(this, "bucket", { bucketPrefix: `learn-cdktf-${name}`, }); // 作成した S3 バケットに Lambda 用の Zip ファイルをアップロード const lambdaArchive = new aws.s3Object.S3Object(this, "lambda-archive", { bucket: bucket.bucket, key: `${config.version}/${asset.fileName}`, source: asset.path, // returns a posix path }); // Lambda 用の IAM ロールを作成 const role = new aws.iamRole.IamRole(this, "lambda-exec", { name: `learn-cdktf-${name}-${pet.id}`, assumeRolePolicy: JSON.stringify(lambdaRolePolicy) });

Slide 9

Slide 9 text

LambdaStack の詳細 2/3 // CloudWatch Logs への書き込みのために実行ロールを追加 new aws.iamRolePolicyAttachment .IamRolePolicyAttachment (this, "lambda-managed-policy" , { policyArn: 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' , role: role.name }); // Lambda 関数の作成 const lambdaFunc = new aws.lambdaFunction .LambdaFunction (this, "learn-cdktf-lambda" , { functionName: `learn-cdktf- ${name}-${pet.id}`, s3Bucket: bucket.bucket, s3Key: lambdaArchive .key, handler: config.handler, runtime: config.runtime, role: role.arn });

Slide 10

Slide 10 text

LambdaStack の詳細 3/3 // API gateway の設定と作成 const api = new aws.apigatewayv2Api .Apigatewayv2Api (this, "api-gw", { name: name, protocolType: "HTTP", target: lambdaFunc.arn }); new aws.lambdaPermission .LambdaPermission (this, "apigw-lambda" , { functionName: lambdaFunc.functionName, action: "lambda:InvokeFunction" , principal: "apigateway.amazonaws.com" , sourceArn: `${api.executionArn}/*/*`, });

Slide 11

Slide 11 text

LambdaStack の作成 new LambdaStack(app, 'lambda-hello-world', { path: "../lambda-hello-world/dist", handler: "index.handler", runtime: "nodejs16.x", // NOTE: サンプルだと nodejs14.x でサポート切れなので修正 stageName: "hello-world", version: "v0.0.2" });

Slide 12

Slide 12 text

LambdaStack のデプロイ $cdktf deploy lambda-hello-world lambda-hello-world Initializing the backend... lambda-hello-world Initializing provider plugins... lambda-hello-world Terraform has made some changes to the provider dependency selections recorded in the .terraform.lock.hcl file. Review those changes and commit them to your version control system if they represent changes you intended to make. Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary. (以下略)

Slide 13

Slide 13 text

LambdaStack の成果物 (Lambda 関数)

Slide 14

Slide 14 text

LambdaStack の成果物 (API Gateway)

Slide 15

Slide 15 text

LambdaStack に Cloudflare の設定を入れるなら import { CloudflareProvider } from "@cdktf/provider-cloudflare/lib/provider" ; import { Record } from "@cdktf/provider-cloudflare/lib/record" ; // Cloudflare の設定 // NOTE: 責務分割的に LambdaStack に書くのはイマイチな気がする... new CloudflareProvider(this, "cloudflare", { apiToken: '' }); new Record(this, "dns-record", { zoneId: '', name: "api", type: "CNAME", value: api.apiEndpoint, proxied: true })

Slide 16

Slide 16 text

お詫び Cloudflare でドメインとってないので検証できてないです、ごめんなさい!

Slide 17

Slide 17 text

まとめ ● マルチクラウド IaC を実現できるはず! ● AWS CDK の L2 コンストラクトのような抽象化はこれからの印象 ● CDKTF の雰囲気をなんとなく感じることはできましたでしょうか 🙏 ● 今後の CDKTF の発展が楽しみです