Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CDKTF ではじめるマルチクラウド IaC

CDKTF ではじめるマルチクラウド IaC

すまぬ、マルチクラウド IaC はじまらなかった

Hayato Watanabe

September 26, 2024
Tweet

More Decks by Hayato Watanabe

Other Decks in Programming

Transcript

  1. CDKTF とは • CDK for Terraform (Cloud Development Kit for

    Terraform) • TypeScript, Python, Java, C#, Go でインフラストラクチャの定義が出来る • HCL の学習なしで Terraform エコシステムを利用可能 • AWS CDK のように DSL を用いた IaC と比べ以下の特徴があります ◦ コンストラクトの概念による抽象度の高いインフラストラクチャ定義 ◦ 再利用できるインフラストラクチャのコンポーネント化 ◦ など...
  2. 僕の考える CDKTF の魅力 • マルチクラウドに対応できる ◦ 最近 Vercel, Supabase, Cloudflare

    などを使いたいケース増えてきたと感じてます • インフラストラクチャとアプリケーションの垣根を超えるコラボレーション ◦ インフラストラクチャとアプリケーションの開発言語が統一されるのは Good ◦ マネージドサービスの採用などによりインフラストラクチャにもビジネスロジックの責務が与えられる と感じています • ソフトウェアエンジニアチームを作る手段となる ◦ エンジニアを役割 (インフラストラクチャ・アプリケーション ) で分けない ◦ チームのつながりを Infrastructure as Codeでデザインする で⾼野さんもお話されていました • なんかかっこいい
  3. 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) });
  4. 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 });
  5. 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}/*/*`, });
  6. 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" });
  7. 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. (以下略)
  8. 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: '<apiToken>' }); new Record(this, "dns-record", { zoneId: '<zoneId>', name: "api", type: "CNAME", value: api.apiEndpoint, proxied: true })
  9. まとめ • マルチクラウド IaC を実現できるはず! • AWS CDK の L2

    コンストラクトのような抽象化はこれからの印象 • CDKTF の雰囲気をなんとなく感じることはできましたでしょうか 🙏 • 今後の CDKTF の発展が楽しみです