どうも、ちゃだいん(@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)でした。