Amazon CodeWhisperer と VS Code で IaCコード書いてみた [Terraform編] #AWSreInvent

CodeWhisperer、CloudFormation,AWS CDK,Terraformもささやくようになりましたん
2023.11.29

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