CloudFormationでFSx for NetApp ONTAPを作成してみた

# CloudFormationでFSx for NetApp ONTAPを簡単にデプロイしたい
* FSx for NetApp ONTAPがデビューした時、CloudFormationで簡単にYAMLでリソースを定義して作成することはできませんでした。あの時はLambdaなど他のツールを使う必要がありましたが、改めてAWS CloudFormationのドキュメンテーションを見てみると、FSx for NetApp ONTAPの部分が追加されていました！
* なので、今回はAWS CloudFormationが使える、FSx for NetApp ONTAPのテンプレートを作成してみたいと思います。

# Keyword
* CloudFormation
    * インフラストラクチャをコードとして扱うことで、AWS およびサードパーティーのリソースをモデル化、プロビジョニング、管理することができます。
* FSx for NetApp ONTAP
    * Linux、Windows、および macOS コンピューティングインスタンスから業界標準の NFS、SMB、および iSCSI プロトコルを介して広くアクセスできる高性能ファイルストレージを提供できるファイルシステム（AWS FSxファムリーの一員として2021年に発表）。
* YAML
    * 構造化データやオブジェクトを文字列にシリアライズ（直列化）するためのデータ形式の一種。テキストのため可読であることは特徴です。

# いきなりまとめ
* Lambdaより、今回の方が簡単に分かりやすく作成できました！

# YMALコード
https://github.com/NetAppJpTechTeam/FSxN-Demo-Environment/blob/development/fsxn_setup.yaml

# テンプレート詳細：パラメータの設定
```yaml:Parameters
  VpcCidr:
    AllowedValues:
    - 10.0.0.0/16
    - 173.31.0.0/16
    - 192.168.0.0/16
    Default: 10.0.0.0/16
    Description: Select the private IPv4 CIDR for the VPC.
    Type: String
  AvailabilityZones:
    Description: Select two 2 Availability Zones (AZ).
    Type: List<AWS::EC2::AvailabilityZone::Name>
  DeploymentType:
    AllowedValues:
    - SINGLE_AZ_1
    - MULTI_AZ_1
    Default: SINGLE_AZ_1
    Type: String
  ThroughputCapacity:
    Description: Select Storage Throughput from 128, 256, 512, 1024, and 2048 MB/s.
    AllowedValues:
    - 128
    - 256
    - 512
    - 1024
    - 2048
    Default: 128
    Type: Number
  StorageCapacity:
    Description: Specify a Storage Capacity between 1024 to 196608.
    Default: 1024
    Type: Number
  FileSystemPassword:
    NoEcho: true
    Description: The password for your FSx for NetApp ONTAP. Must contain at least 8 characters in the allowed pattern ("^[^\u0000\u0085\u2028\u2029\r\n]{8,50}$").
    Type: String
    MinLength: 8
    AllowedPattern: ^[^\u0000\u0085\u2028\u2029\r\n]{8,50}$
    ConstraintDescription: Your FSx for NetApp ONTAP password must contain at least 8 characters in the allowed pattern ("^[^\u0000\u0085\u2028\u2029\r\n]{8,50}$").
```
今回のテンプレートは最初に以下のパラメーターを入力できます：
* VpcCidr
    * テンプレートで作成するネット環境で、VPCのサイダー（CIDR）を選択します。
    * CIDRとは：https://www.nic.ad.jp/ja/basics/terms/cidr.html
* AvailabilityZones
    * 現在CloudFormationを実行するリージョンに使用可能なAZを選択します。
    * FSx for NetApp ONTAPはMulti-AZの構造を選択可能なので、二つAZを選択してください。
* DeploymentType
    * Single_AZとMulti_AZを選択します。
    * Multi_AZの場合、二つサブネットを使います。
* ThroughputCapacity
    * FSx for NetApp ONTAPの性能を指定します。
    * 128, 256, 512, 1024, 2048 MB/sから選択します。
* StorageCapacity
    * FSx for NetApp ONTAPの容量を指定します。
    * 最小1024GB、最大196608の仕様になっています。
* FileSystemPassword
    * 作成されたファイルシステムのパスワードを指定します。
    * 今回は検証環境なので、Secret Managerを使ってないです。


# テンプレート詳細：条件設定
```yaml: Deployment Type
Conditions:
  IsSingleAZ: !Equals
    - !Ref DeploymentType
    - "SINGLE_AZ_1"
  IsMultiAZ: !Equals
    - !Ref DeploymentType
    - "MULTI_AZ_1"
```
今回は二つパターンのデプロイメントタイプを選択できますので、最初に条件判定を指定しました
* デプロイメントタイプはSINGLE_AZの時　
    * DeploymentType = "SINGLE_AZ_1"
    * IsSingleAZ = True
* デプロイメントタイプはMULTI_AZの時　
    * DeploymentType = "MULTI_AZ_1"
    * IsMultiAZ = True



# テンプレート詳細：FSx for NetApp ONTAPファイルシステムの作成
```yaml:File System 
  FileSystem:
    Type: "AWS::FSx::FileSystem"
    Properties:
      FileSystemType: "ONTAP"
      StorageCapacity: !Ref StorageCapacity
      SubnetIds: !If
        - IsSingleAZ
        - - !Ref PublicSubnet0
        - - !Ref PublicSubnet0
          - !Ref PublicSubnet1
      SecurityGroupIds:
        - !Ref SecurityGroup
      OntapConfiguration:
        FsxAdminPassword: !Ref FileSystemPassword
        DeploymentType: !Ref DeploymentType
        ThroughputCapacity: !Ref ThroughputCapacity
        PreferredSubnetId: !If
          - IsMultiAZ
          - !Ref PublicSubnet0
          - !Ref AWS::NoValue
```
この部分は実際にFSx for NetApp ONTAPファイルシステムを作成します
* デプロイメントタイプはSINGLE_AZの時　
    * IsSingleAZ = True
    * SubnetIdsのところに作成されたPublicSubnet0をレファレンス。
    * PreferredSubnetIdのところにはNoValueを指定します
* デプロイメントタイプはMULTI_AZの時　
    * IsMultiAZ = True
    * SubnetIdsのところに作成された二つサブネットをレファレンス。
    * PreferredSubnetIdのところにはPublicSubnet0を指定します
* サブネットとアタッチするセキュリティグルプはネットリソースのところに構築しました。
    * 省略しましたが、コードの８７行から１９１行までご参照ください。


# テンプレート詳細：FSx for NetApp ONTAP SVMとVolumeの作成
```yaml:SVM 
  SVM0:
    DependsOn: FileSystem
    Type: "AWS::FSx::StorageVirtualMachine"
    Properties:
      FileSystemId: !Ref FileSystem
      Name: SVM0
```
```yaml:Volume 
  Volume1:
    DependsOn: SVM0
    Type: "AWS::FSx::Volume"
    Properties:
      Name: vol1
      VolumeType: "ONTAP"
      OntapConfiguration:
        JunctionPath: /vol1
        SizeInMegabytes: 10240
        StorageEfficiencyEnabled: true
        StorageVirtualMachineId: !Ref SVM0
```

この部分は実際にFSx for NetApp ONTAPのSVMとVolumeを作成します
* SVMとは
    * データにアクセスするための独自の管理資格 IP アドレスを持つ、分離された仮想ファイルサーバです。
    * 各FSx for NetApp ONTAPファイルシステム上で 1 つまたは複数の ストレージ仮想マシン (SVM) を作成できます。
* 作成されたVolumeについて
    * SVM0上に作成されます
    * サイズは10GB
    * パスは/vol1


# Reference
* [CIDRとは](https://www.nic.ad.jp/ja/basics/terms/cidr.html)
* [ドキュメンテーション AWS CloudFormation Parameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)
* [ドキュメンテーション AWS CloudFormation Conditions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html)
* [ドキュメンテーション AWS::FSx::FileSystem](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html)
* [動画：Amazon FSx for NetApp ONTAP DEMO using CloudFormation](https://www.youtube.com/watch?v=a_EqgdKfa2M)