CloudFormation再来！基本の「k」を解釈したい。

## 全般
公式ドキュメントを直感的に理解できる方いらっしゃいますか？
私は苦しむパターンの人間です(-_-;)
公式ドキュメントの見方と、超基本的な書き方と、どこを見れば載ってるよ。という基本を押さえて、かつ少しでも公式ドキュメントの苦手意識払拭のためにも記事にします。
## ぱっと見てみる。
```
Type: AWS::EC2::VPC
Properties:
  CidrBlock: String
  EnableDnsHostnames: Boolean
  EnableDnsSupport: Boolean
  InstanceTenancy: String
  Ipv4IpamPoolId: String
  Ipv4NetmaskLength: Integer
  Tags: 
    - Tag
```

ではこれについて説明してください。と言われて即答できない(笑)
私がやっと理解できるかもしれない書き方⇒
```
Type: AWS::EC2::VPC 　　　　# VPC作成時の決まり文句
Properties:　　　　　　　　　# 設定
  CidrBlock: "10.0.0.0/16"  # VPCのCIDR
  EnableDnsHostnames: true  # DNSホスト名を有効にするかどうか
  EnableDnsSupport: true  　# DNSサポートを有効にするかどうか
  InstanceTenancy: "default"  # テナンシーを指定
  Ipv4IpamPoolId: "ipam-pool-0123456789abcdef"  # IP範囲内のID指定
  Ipv4NetmaskLength: 24  # サブネットマスク
  Tags: 　　　　　　　　　# タグ付け
    - Key: "Name"　　　　# Nameキー 
      Value: "MyVPC"　　 # MyVPCと申します。
```
ここでドキュメントを見る。各項目の「必須」か否かを確認する。

## 見る順番と意味
まずリンクから公式ドキュメントを開いて、英語と日本語両方を駆使してみるべきところを見定める。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html

作りたい識別子は、「yml(yaml)」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/3b985221-85f2-7d25-143b-fdc13f35336d.png)
まずこのデフォルトのコードをテキストエディターに何も言わず貼り付けるのです。
そう、なにも言わず。
そしてドキュメントをスクロールして、「Required(必須か否か)」を確認して、「Conditional(条件付き)」又は「YES」は、基本必要なので項目に残す。

そして、stringは文字か数字が入り、boolean(ブール値と読む。)はtrueかfalseかが入る。

これで何か見えてくる。


## コードを書いてみる。
ほぼ日本語で書いてみるw

```
サービス:VPC

設定:
範囲:10.0.0.0/16

タグ:
名前は
おれのVPC
```
極端(笑)これを英語にするだけ。
```
Type: AWS::EC2::VPC
Properties:
  CidrBlock: "10.0.0.0/16"
 Tags: 　　　　　　　　　
    - Key: "Name"　　　　 
      Value: "MyVPC"
```

## 試しに他のコード拝見
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-iot-accountauditconfiguration.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/166cdbdc-f702-4267-33bc-40968fd91be0.png)


・・・「IoTデバイスなどの監査」を行うものです。データをかき集めるときに証明書切れとかないかな？といったように監査してくれるよう。

細部は公式サイトを読んでください。あくまで私の解釈です。

コードを見る。
```
Type: AWS::IoT::AccountAuditConfiguration
Properties:
  AccountId: String
  AuditCheckConfigurations: 
    AuditCheckConfigurations
  AuditNotificationTargetConfigurations: 
    AuditNotificationTargetConfigurations
  RoleArn: String
```

要約して日本語で書く。
```
サービス:IoT(監査)

設定:
アカウント指定

チェックしたい内容

接続許可
```
英語にしていきます。そして必須のものであれば次のコードで完成するはずなのです。
```
Type: AWS::IoT::AccountAuditConfiguration
Properties:
  AccountId:12344321

AuditCheckConfigurations:
    AuthenticatedCognitoRoleOverlyPermissiveCheck:
      Enabled: true

RoleArn: 'arn:aws:iam::123456789012:role/service-role/AWSIoTDeviceDefenderAudit'
```

## ここで「!Ref」を学ぶ。
はい。関数の登場。
```
x+y=5です。と仮定して。

y=2でxは何になりますか？みたいな感じかな
```
コードでやってみる。
```
Resources:
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: VPC123

  MySubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: us-east-1a
      Tags:
        - Key: Name
          Value: MySubnet
```
お分かりいただけただろうか。
ラベルが「MySubnet:」という文字の後に、「VpcId: !Ref MyVPC」という参照で、前に書いたコードを引っ張っています。
あとは、構築する順番（リソースを配置する順番）さえ気にすれば、ある程度のコードが書けそうですね。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html

Pythonの学習でもそうでしたが、コード自体の新旧や、環境のちょっとした違いでコードが通らなかったりしますよね。~~それは気合と根性~~
それも同じかもしれませんね！

次はAWS Certified Solutions Architect - Associate [AWS SAA-C03] 合格体験記を職場の記事とは違う切り口で投稿できればおもろいなと思っています！次回をお楽しみに！近況を添えてお送りします!(^^)!