CodeWhispererが Infrastructure as Code (IaC)をサポートし CloudFormation・CDK・Terraformに対応しました #AWSreInvent

CodeWhispererが Infrastructure as Code (IaC)をサポートしたので、CloudFormationで動作を検証してみました。
2023.12.06

あしざわです。

Amazon CodeWhispererは AWSにおけるコード生成AI系サービスです。

re:Invent開催日直前に、「CodeWhispererがIaCに対応した」というアップデートが発表されていたのでご紹介します。

AWS Blogの記事はこちらです。

アップデート概要

CodeWhispererの機能が拡張されて Infrastructure as Code (IaC)をサポートし、AIを活用したコード修復およびセキュリティスキャンが可能になりました。

新しくサポートしたIaCと関連する言語はこちら。

  • AWS CloudFormation
    • YAML
    • JSON
  • AWS CDK
    • TypeScript
    • Python
  • HashiCorp Terraform
    • HCL

TypeScriptはこのアップデートより前に対応しており、CDK(typeScript)については以前から機能が使えたようですがこの度正式にサポートされたようです1

DevelopersIOでは、既にTerraform版のやってみた記事が紹介されています。

本記事では、CloudFormation(YAML)を使った検証を行ってみます。

やってみた

検証にあたって、事前に検証用AWS環境のAmazon CodeWhispererをIndividual Tierで有効化し、ローカル環境のVisual Studio CodeにAWS Toolkitを導入、CodeWhispererが利用できるようにしています。

CodeWhispererを利用したコード執筆のTIPSは、こちらのAWSブログで紹介されています。

ここからは、CodeWhispererの主要機能である2つにフォーカスして検証していきます。

  • 生成AIによるコード執筆におけるレコメンド
  • コードに対するセキュリティスキャン

生成AIによるコード執筆におけるレコメンド

事前準備として、AWS ToolkitのCodeWhispererが有効化されていることをAWS Toolkitのアクティビティバー上でチェックしておきます。アクティビティバーではPause Auto-Suggestion|| となっていればOKです。

左下にあるバーにて、「CodeWhisperer」が ▶️ となっていればOKです。

cfn.yamlという空のファイルを作成し、## Create VPC and EC2 by CloudFormationという1行をから入力して、改行します。

すると、AWSTemplateFormatVersion: 2010-09-09というCloudFormationテンプレートの基礎となる一文がレコメンドされました。

タブを押すとレコメンドされた内容を確定できます。

レコメンドは複数出力されるケースがあり、←キーや→キーで選択できます。

続けて「改行してレコメンドを待ってタブ」を繰り返していくとDescriptionParametersと次々とレコメンドが続いていきます。

ところどころレコメンドのオートコンプリートが発動しなくなりますが、Option + C(Mac)またはAlt + C(WIndows)で手動表示もできます。

引き続きオートコンプリートなど入力補完を利用、手動で修正することで、以下のようなテンプレートが出来上がりました(ところどころツッコミどころがあるのは承知です)

## Create VPC and EC2 by CloudFormation
AWSTemplateFormatVersion: 2010-09-09
Description: Create VPC and EC2 by CloudFormation
Parameters:
  VpcCidr:
    Type: String
    Default: 10.0.0.0/16
  SubnetCidr:
    Type: String
    Default: 10.0.0.0/24
  InstanceType:
    Type: String
    Default: t2.micro
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Default: cfn-key-pair
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCidr
      EnableDnsSupport: true
      EnableDnsHostnames: true
  InternetGateway:
    Type: AWS::EC2::InternetGateway
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway
  Subnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref SubnetCidr
      MapPublicIpOnLaunch: true
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  Route:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  SubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref Subnet
      RouteTableId: !Ref RouteTable
  EC2:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: XXXXXXXXXXXXXXXXXXXXX
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      SubnetId: !Ref Subnet
      SecurityGroupIds:
        - !Ref SecurityGroup
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: cfn-sg
      GroupDescription: Allow SSH access via port 22
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

こちらのCFnテンプレートは無事デプロイできました。

コードセキュリティスキャン

AWSセキュリティに詳しい方ならすぐわかると思いますが、こちらのテンプレートには見てすぐわかるようなセキュリティ的な欠陥がいくつもあります。

例えば以下

  • EC2のセキュリティグループに 22番ポートに対するフルアクセスが設定されている
  • EC2にパブリックIPが付与されている

CodeWhispererのセキュリティスキャンを利用して、それらが検知されるのかをチェックしてみましょう。

セキュリティチェックは、コードレコメンドと同じくAWS Toolkitのアクティビティバー上にあるRun Security Scanから実行します。スキャン実施時、対象のコードが含まれるファイルがアクティブになっているようにしてください。

スキャン後、問題タブに表示されているようにいくつかのセキュリティ違反項目が検知されています。

今回のコードでは5件ありました。

  • Amazon Virtual Private Cloud (Amazon VPC) subnets are not assigned a public IP address.
  • Monitoring is not enabled for EC2 instances.
  • EBS Optimization is not enabled for EC2 instances.
  • IAM profile is not attached with EC2 instance.
  • CidrIp Property is set to 0.0.0.0/0.

コード上の検知箇所をホバーすると詳細が表示されます。View Detailからは項目の詳細を別タブで確認できます。

重要度や参考ドキュメントはCode Guruのものが表示されています。CodeWhispererのセキュリティスキャンのベースになっている技術はCode Guruなんだとここからわかります。

粛々と違反の是正に対応していきました。

  • サブネットの自動パブリックIP付与の設定を無効に変更(MapPublicIpOnLaunch: false)
  • EC2の詳細モニタリングを有効化(Monitoring: true)
  • EC2のEBS最適化設定を有効化(EbsOptimized: true)
  • EC2にインスタンスプロファイルを設定(IamInstanceProfile: !Ref InstanceProfile)。別途IAMロールを作成(InstanceProfile: および InstanceRole:)

是正の際にもコード生成機能は役立ちましたが、違反対応におけるレコメンドを詳細画面で具体的に出してくれるとより嬉しいな、と思いました。

案内に従ってすべて是正した後、再度セキュリティスキャンすると、すべての問題が解決していました。

こちらのコードを使ってUpdateStackしたところ、問題なくデプロイできました。

※レコメンドされたt2.microのインスタンスタイプがEBS最適化オプションをサポートしていなかったため、t3.microに修正しました。

最終系のコードがこちらです。

```yaml
## Create VPC and EC2 by CloudFormation
AWSTemplateFormatVersion: 2010-09-09
Description: Create VPC and EC2 by CloudFormation
Parameters:
  VpcCidr:
    Type: String
    Default: 10.0.0.0/16
  SubnetCidr:
    Type: String
    Default: 10.0.0.0/24
  InstanceType:
    Type: String
    Default: t3.micro
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Default: cfn-key-pair
  EC2ImageId:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCidr
      EnableDnsSupport: true
      EnableDnsHostnames: true
  InternetGateway:
    Type: AWS::EC2::InternetGateway
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway
  Subnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref SubnetCidr
      MapPublicIpOnLaunch: false
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  Route:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  SubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref Subnet
      RouteTableId: !Ref RouteTable
  EC2:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref EC2ImageId
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      SubnetId: !Ref Subnet
      SecurityGroupIds:
        - !Ref SecurityGroup
      ## EBS Optimized
      EbsOptimized: true
      ## Monitoring
      Monitoring: true
      ## Instance Profile
      IamInstanceProfile: !Ref InstanceProfile
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: cfn-sg
      GroupDescription: Allow SSH access via port 22
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 192.0.2.0/24
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
  InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref InstanceRole
  InstanceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
      Path: /

検証は以上です。

セキュリティスキャンの留意点として、Individual プランではコードセキュリティスキャンの制限が50回/月/ユーザーであまり余裕があるものではありません。検証用途なら問題ないと思いますが無闇にスキャンしないようにお気をつけください。

その他料金やサービス使用について知りたい方は、CodeWhispererの製品ページをご覧ください。

料金

本機能の利用にあたって、追加のコストは発生しません。

対応リージョン

Amazon CodeWhispererは利用リージョンに依存せず、世界中から利用できます。

CodeWhispererのサービス自体は、現在米国東部 (バージニア北部) リージョンでホストされています。

参考: Amazon CodeWhisperer のよくある質問

最後に

Amazon CodeWhispererを利用したCloudFormationテンプレートのコード生成レコメンド、コードセキュリティスキャンを試してみました。

誰かの参考になれば幸いです。


  1. 筆者はアップデート以前のCode Whispererに関する知識があまりありません。本件は確証があるものではなく、re:Invent2023現地のExpoにて「AWSブースにてDevOps担当のAWS SAの方に英語でそのような説明を受けた」くらいなので想定で書いています。間違っていたらご指摘ください。