初めてAWS Cloudformationをさわる人へ_邪道編

## 目次
1.はじめに
2.AWS Cloudformationを選んだ理由
3.邪道なAWS Cloudformationテンプレート作成
4.おわりに

## はじめに
最近、IaC（Infrastructure as Code）という言葉をよく聞くようになりました。
IaCとはCPUやメモリ、ストレージ、サービス、ネットワークなどのインフラ環境をコードを用いて自動的に構築することです。
IaCのメリットとして下記があります。
・コードで構築するため設定ミスの防止が可能
・コード化されたインフラを再利用するため構築コスト削減

IaCツールの一つであるAWS Cloudformationについて勉強し始めたので、初心者向けにメモを残します。
邪道編（生成AIに依頼）と正道編の二部構成です。


## AWS Cloudformationを選んだ理由
IaCができる有名なツールといてTerraformとAWS Cloudformationがあります。
メインで利用するクラウドがAWSだったことから、TerraformではなくAWS Cloudformationをまずは学ぶことにしました。
マルチクラウドで環境を構築する場合はTerraformが良いかと思います。

### TerraformとAWS Cloudformationの比較表
||Terraform|AWS Cloudformation|
|---|---|---|
|UI  |CUI ( terraform コマンド)|CUI (AWSCLI)、GUI (AWSコンソール)|
|リソースの管理方法  |ファイルで管理|ファイルで管理、AWSのサービスで自動管理|
|マルチクラウド性|複数プラットフォームに対応|AWS以外のリソース作成不可|
|文法 |HCL(Hashicorp Configuration Language)というDSL|jsonまたはyaml|
|組込み関数|多い|少ない|

TerraformとAWS CloudFormationの違いについてはこちらの記事を参考にしています。

https://qiita.com/answer_d/items/74c3d317058d48394d21


## AWS Cloudformationテンプレート作成方法（邪道）
まず邪道なテンプレートの作成方法です。

### 作成方法：AIにお願い
チャットボットを立ち上げます。
「CloudformationでVPC,パブリックサブネット、InterNetGatewayを構築するコードを教えてください。」と送ります。
以上です。
![IMG_3008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/a36c6e7a-4d32-911d-1322-268251a42d6b.jpeg)

下記が実際に出力したコードになります。
```yaml:VPC,PublicSubnet,InternetGateway
AWSTemplateFormatVersion: '2010-09-09' 
Description: 'VPC, Public Subnet, and Internet Gateway setup'

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: '10.0.0.0/16'
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: MyVPC

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: MyInternetGateway

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: '10.0.1.0/24'
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: PublicSubnet

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: PublicRouteTable

  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: '0.0.0.0/0'
      GatewayId: !Ref InternetGateway

  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable

Outputs:
  VPCId:
    Description: The ID of the VPC
    Value: !Ref VPC
    Export:
      Name: !Sub '${AWS::StackName}-VPCId'

  PublicSubnetId:
    Description: The ID of the Public Subnet
    Value: !Ref PublicSubnet
    Export:
      Name: !Sub '${AWS::StackName}-PublicSubnetId'

  InternetGatewayId:
    Description: The ID of the Internet Gateway
    Value: !Ref InternetGateway
    Export:
      Name: !Sub '${AWS::StackName}-InternetGatewayId'
```

AWS Cloudformationでスタックが正常に作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/10a88dab-4805-476f-afe6-8d092c05c4a7.png)

今回はX（旧Twitter）のGROKを使いました。
無料で一般的に使いやすいく身近なAIとしては優秀です。


## おわりに
まっとうなテンプレート作成方法についてセクションや関数説明とか話そうとするとテキスト量が多くなってしまうので2部構成にします。
次回、正道編です。