はじめに
こんにちはあるいはこんばんは。みなさんはCloudFormationを使っていらっしゃいますか?私はふだんTerraformを使うことが多く、Cloudformationを勉強中です。勉強中ですとやはり、Linterや静的解析ツールに色々教えてもらいたくなります。
今回は、CloudformationのLinter、cfn-lintを試してみます。
cfn-lintのLinter規則は以下をご覧ください。
実際にやってみる
CloudFormationテンプレートのサンプルはこちらです。
Resources:
MyVPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: MyVPC
MySubnet:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref MyVPC
CidrBlock: 10.0.1.0/24
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: MySubnet
MySecurityGroup:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: My security group
VpcId: !Ref MyVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
MyEC2Instance:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: ami-0abcdef1234567890 # Replace with your AMI ID
InstanceType: t2.micro
SubnetId: !Ref MySubnet
SecurityGroupIds:
- !Ref MySecurityGroup
KeyName: my-key-pair # Replace with your key pair name
では、上記に色々フォーマットエラーを仕込んでみましょう。
(1)存在しないTypeにタイポしてみます。
- Type: 'AWS::EC2::VPC'
+ Type: 'AWS::EC2::VPCC'
(1)指摘できました
E3001 Invalid or unsupported Type AWS::EC2::VPCC for resource MyVPC in us-east-1
cfn.yaml:3:5
E3008 Property "VpcId" can Ref to resources of types [AWS::EC2::VPC] at Resources/MySubnet/Properties/VpcId/Ref
cfn.yaml:15:7
E3008 Property "VpcId" can Ref to resources of types [AWS::EC2::VPC] at Resources/MySecurityGroup/Properties/VpcId/Ref
cfn.yaml:26:7
(2)subnetのIP範囲を、VPCを超えたものにしてみます。
- CidrBlock: 10.0.1.0/24
+ CidrBlock: 10.0.0.0/8
(2)指摘できました。指摘の言い方がちょっと異なりますが。
E3031 CidrBlock contains invalid characters (Pattern: x.x.x.x/y) at Resources/MySubnet/Properties/CidrBlock
cfn.yaml:16:7
(3)存在しないプロトコルにタイポしてみます
- - IpProtocol: tcp
+ - IpProtocol: tcpp
(3)残念!!見つけられませんでした。ここから先は、静的解析ツールが必要かもしれません。
まとめ
今回は、cfn-lintを試してみました。細かな静的解析までいかずとも、コードを書く上でかなり助けてくれそうです。
- AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
- Terraform は、HashiCorp, Inc. の米国およびその他の国における商標または登録商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。