CodeWhispererが Infrastructure as Code (IaC)をサポートし CloudFormation・CDK・Terraformに対応しました #AWSreInvent
あしざわです。
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テンプレートの基礎となる一文がレコメンドされました。
タブを押すとレコメンドされた内容を確定できます。
レコメンドは複数出力されるケースがあり、←キーや→キーで選択できます。
続けて「改行してレコメンドを待ってタブ」を繰り返していくとDescription
、Parameters
と次々とレコメンドが続いていきます。
ところどころレコメンドのオートコンプリートが発動しなくなりますが、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テンプレートのコード生成レコメンド、コードセキュリティスキャンを試してみました。
誰かの参考になれば幸いです。
- 筆者はアップデート以前のCode Whispererに関する知識があまりありません。本件は確証があるものではなく、re:Invent2023現地のExpoにて「AWSブースにてDevOps担当のAWS SAの方に英語でそのような説明を受けた」くらいなので想定で書いています。間違っていたらご指摘ください。 ↩