Amazon CodeWhisperer と VS Code で IaCコード書いてみた [Terraform編] #AWSreInvent
どうも、ちゃだいん(@chazuke4649)です。
Amazon CodeWhisperer が IaC (Infrastructure as Code) サポートしましたね!
早速、Terraformでも試してみましょう!
やってみた
前提
ちなみに自分のVS Codeには、GitHub Copilotも入っていますが、ややこしいので一旦無効化しています。
VS Codeにて、CodeWhispererを有効化する
VS Codeを立ち上げ、まだ AWS Toolkit 拡張が入っていない場合は、拡張機能をインストールします。
続いて、AWSのアイコンをクリックし、CodeWhispererの"Sign in to get started"を選択します。
各機能ごとでサインインできるようですが、Amazon Q + CodeWhispererの"Use for free with AWS Builder ID" を選択します。
ここで、AWS Builder IDをすでに持っていれば、既存アカウントでログインし、なければ新しく作ります。
サインインが完了すると、Amazon Qの主張がすごいですが、今回はCodeWhispererを試したいので一旦スルーします。
下のバーにも CodeWhispererが稼働中(▶️)であることがわかります。
Terraformコードを書く
適当にtemp.tfと言うファイルを作成し、以下のようにプロンプト的な指示として、作りたいものをコメントで記入します。
すると、CodeWhispererの提案として、1行目の候補が出てきました。
tabキーを押して、これを承認すると、resourceブロックの中身の提案が出てきました。
これを承認すると、一旦S3バケット本体のサンプルコードが生成された、といった感じです。
いい感じですね。
続いて、流れとして静的WebサイトホスティングのためのS3バケットなので、関連する追加設定を入れてみます。
以下の通りwebサイトホスティング周りの設定を入れたい旨を記載すると、また1行目の提案が出てきました。
これを承認すると、続いて中身の提案がきました。
これも承認します。
同じようなノリでコメントに追加したいものを書いていきます。次はアクセス制御の設定を追加していきます。
するとブロックパブリックアクセス設定の候補が出てきました。
具体的にバケットポリシーを追加したいコメントを書くと、バケットポリシーのサンプルコードも、JSONポリシーはデータソースとして渡す構成で提案されました。
すごい...
ただしポリシーを見るとお気づきの通り、CloudFrontを介する意図が読み取れます。
これを承認し、改行すると最後はCloudFront作りまっせと言わんばかりにコメント自体の提案もきました。
言われるがままに少しコメントで指示をしましたが、他はほとんどtabキーを押して、提案を受け入れていくと以下のようなサンプルコードが仕上がりました。
# Terraformにて 静的WebサイトをホストするためのAmazon S3バケットを作成 resource "aws_s3_bucket" "static_site" { bucket = "XXXXXXXXXXXXXXXXXX" acl = "private" versioning { enabled = true } tags = { Name = "static-site-bucket" } } # 上記S3バケットの静的Webサイトホスティング設定を追加する resource "aws_s3_bucket_website_configuration" "static_site" { bucket = aws_s3_bucket.static_site.id index_document { suffix = "index.html" } error_document { key = "error.html" } } # 上記S3バケットに適切なアクセス制御を追加する resource "aws_s3_bucket_public_access_block" "static_site" { bucket = aws_s3_bucket.static_site.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } # 上記S3バケットに適切なバケットポリシーをバケットポリシーを追加する resource "aws_s3_bucket_policy" "static_site" { bucket = aws_s3_bucket.static_site.id policy = data.aws_iam_policy_document.static_site.json } data "aws_iam_policy_document" "static_site" { statement { sid = "AllowCloudFrontServicePrincipal" effect = "Allow" principals { type = "Service" identifiers = ["cloudfront.amazonaws.com"] } actions = ["s3:GetObject"] resources = ["${aws_s3_bucket.static_site.arn}/*"] } } # 上記S3バケットに適切なCloudFrontエンドポイントを作成する resource "aws_cloudfront_distribution" "static_site" { origin { domain_name = aws_s3_bucket.static_site.bucket_regional_domain_name origin_id = XXXXXXXXXXXXX.static_site.id } enabled = true is_ipv6_enabled = true default_cache_behavior { allowed_methods = ["GET", "HEAD"] cached_methods = ["GET", "HEAD"] target_origin_id = XXXXXXXXXXXXX.static_site.id forwarded_values { query_string = false cookies { forward = "none" } } viewer_protocol_policy = "redirect-to-https" min_ttl = 0 default_ttl = 3600 max_ttl = 86400 } restrictions { geo_restriction { restriction_type = "none" } } viewer_certificate { cloudfront_default_certificate = true } }
ツッコミどころはあれど、ここまでほぼ自動的に書いてくれたらベースとしては文句なしですね。すばらっ!
終わりに
Amazon CodeWhispererにて、IaCがサポートされたので、Terraformコードを書いてみました。控えめにいって最高ですね。
しかも今回はAWS Builders IDによる、CodeWhisperer Individual Tierでしたが、無料です!
AI コードジェネレーター - Amazon CodeWhisperer の料金 - AWS
これがあればIaCをこれから始める人も、インフラコードをソッコーで作ってしまいたい人も大幅に加速できそうです。使っていきましょう!
それでは今日はこの辺で。ちゃだいん(@chazuke4649)でした。