あしざわです。
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の方に英語でそのような説明を受けた」くらいなので想定で書いています。間違っていたらご指摘ください。 ↩