CloudFormationでFSx For NetApp ONTAPのテスト環境を構築してみた

# CloudFormationでFSx for NetApp ONTAPのテスト・デモ環境を構築する流れを自動化したい
仕事柄で、よくFSx For NetApp ONTAPについての技術検証またはお客様向けのワークショップをします。この間に、以下の不便なことを感じました：
* 環境の構築について
    * FSx For NetApp ONTAPファイルシステムの作成は時間がかかります。またADが必要な場合、作成順番があるため、ずっと画面をモニターリングする必要があります。
    * 手作業なら、ミスが発生する可能性があります。
    * AWSに不慣れなお客様がいらっしゃるので、構築の時間は予測し難くて、ワークショップの時間設定は難しいです。
* 環境の削除について
    * 作成と同じ、削除も順番があり、画面をモニターリングする必要があります。
    * 依存関係が間違って場合、削除失敗のエラーが発生します。


これらの不便さを解消するため、CloudFormationでFSx for NetApp ONTAPのテスト・デモ環境を構築する流れを自動化したいと考えました。もし自動化できれば、環境の作成と削除は一回クリックしたら手を離してコーヒーを飲みながら待つことができるようになって超楽だと思います。
# 自動で構築したい環境
FSx For NetApp ONTAPのデプロイメントタイプはMulti AZの場合：
![Architecture01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781205/d65ca831-870f-43e0-bb8a-238696ba14fd.png)

FSx For NetApp ONTAPのデプロイメントタイプはSingle AZの場合：
![Architecture02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781205/2fd2ce11-c43e-703f-27c3-0a81a76be29a.png)

:::note info
以下のリソースはパラメータに「ADを作成する(Create an AD for me)」を選択する時作成されます：
* AWS Managed Microsoft AD
* Windows Instance
* SVMAD
:::


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

# 構築フローチャット
![Flowchat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781205/70c3d893-61d3-9b4d-76e3-9ed648cfe13e.png)




# いきなりまとめ
* この環境の構築は自動化できる？
    * はい、できます！
* 不便なことを解決できた？
    * はい、できました
        * 環境の構築について：パラメータを設定して実行したら、全部順番通り構築してくれます（所要時間は４０−５０分）。
        * 環境の削除について：スタックを削除すれば、全部のリソースは正しい依存関係の上で順番に削除されます（フローチャットの逆方向）。
# YMALコード
https://github.com/NetAppJpTechTeam/FSxN-Demo-Environment/blob/development/fsxn_demo_environment_initial.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
  InstanceType:
    Description: Select the instance type.
    AllowedValues:
    - t2.micro
    - m5.large
    - c5n.xlarge
    - c5n.2xlarge
    - c5n.9xlarge
    - c5n.18xlarge
    - r5n.8xlarge
    - r5n.16xlarge
    - r5n.24xlarge
    Default: t2.micro
    Type: String
  KeyPair:
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: Must specify your key pair
  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
  LatestWindowsAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-windows-latest/Windows_Server-2022-English-Full-Base'
  LatestLinuxAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
  EnvironmentPassword:
    NoEcho: true
    Description: The password for your FSx for NetApp ONTAP and MS Directory Admin.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 environment password must contain at least 8 characters in the allowed pattern ("^[^\u0000\u0085\u2028\u2029\r\n]{8,50}$").
  EnvironmentType:
    Description: Is Microsoft AD required in your environment
    AllowedValues:
    - "Create an AD for me"
    - "I don't need an AD"
    Type: String
    ConstraintDescription: Must specify the AD resources
```
今回のテンプレートは最初に以下のパラメーターを入力できます：
* VpcCidr
    * テンプレートで作成するネット環境で、VPCのサイダー（CIDR）を選択できます。
    * CIDRとは：https://www.nic.ad.jp/ja/basics/terms/cidr.html
* AvailabilityZones
    * 現在CloudFormationを実行するリージョンに使用可能なAZを選択できます。
    * Amazon Managed ADはMulti-AZの構造なので、二つAZを選択してください。
* DeploymentType
    * Single_AZとMulti_AZを選択します。
    * Multi_AZの場合、二つサブネットを使います。
* InstanceType
    * Windows Instanceを立ち上げる時のインスタンスタイプを選択します。
    * デフォルトは一番安いt2.microです。
* KeyPair
    * 現在CloudFormationを実行するリージョンに使用可能なKeyPairを選択します。
    * 選択できない場合、現在のリージョンにはKeyPairを作ってないことを示します。
    * KeyPairの作成手順：https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/create-key-pairs.html
* ThroughputCapacity
    * FSx for NetApp ONTAPの性能を指定します。
    * 128, 256, 512, 1024, 2048 MB/sから選択します。
* StorageCapacity
    * FSx for NetApp ONTAPの容量を指定します。
    * 最小1024GB、最大196608の仕様になっています。
* LatestWindowsAmiId
    * 最新のWindows InstanceのAMIを取得します。
    * デフォルトはWindows_Server-2022-EnglishのOSがデプロイされています。
    * 修正したい時はUrlを変更してください。
* LatestLinuxAmiId:
    * 最新のLinux InstanceのAMIを取得します。
    * デフォルトはAmazon Linux 2のOSがデプロイされています。
    * 修正したい時はUrlを変更してください。
* EnvironmentPassword:
    * 作成されたADとファイルシステムのパスワードを指定できます。
    * 今回は検証環境なので、Secret Managerを使ってないです。
* EnvironmentType
    * AD関連のリソースを作成するかどうかを選択できます


# テンプレート詳細：条件設定
```yaml: 
Conditions:
  CreateADResources: !Equals
    - !Ref EnvironmentType
    - "Create an AD for me"
  IsSingleAZ: !Equals
    - !Ref DeploymentType
    - "SINGLE_AZ_1"
  IsMultiAZ: !Equals
    - !Ref DeploymentType
    - "MULTI_AZ_1"
```
* AD関連のリソースを作成する時
    * EnvironmentType = "Create an AD for me"
    * CreateADResources = True
* デプロイメントタイプはSINGLE_AZの時　
    * DeploymentType = "SINGLE_AZ_1"
    * IsSingleAZ = True
* デプロイメントタイプはMULTI_AZの時　
    * DeploymentType = "MULTI_AZ_1"
    * IsMultiAZ = True


# テンプレート詳細：AD関連のリソース作成
以前の記事をご参考してください：[EC2 InstanceをAmazon Managed ADに自動JoinすることをCloudFormationでやってみた](https://qiita.com/Shengyu/private/476bc165a3795d5141db)


# テンプレート詳細：ファイルシステムの作成
以前の記事をご参考してください：[CloudFormationでFSx for NetApp ONTAPを作成してみた](https://qiita.com/Shengyu/private/617bb0c14bcf7180fe88)

# テンプレート詳細：FSx for NetApp ONTAPのSVMをADにJoin
```yaml: SVM Join AD
  #FSx for NetApp ONTAP SVM (Join AD)
  SVMAD:
    DependsOn:
      - FileSystem
      - MSDirectory
    Type: "AWS::FSx::StorageVirtualMachine"
    Condition: CreateADResources
    Properties:
      FileSystemId: !Ref FileSystem
      Name: SVMAD
      ActiveDirectoryConfiguration:
        NetBiosName: "SVMAD"
        SelfManagedActiveDirectoryConfiguration:
          DnsIps:
            - !Select [0, !GetAtt MSDirectory.DnsIpAddresses]
            - !Select [1, !GetAtt MSDirectory.DnsIpAddresses]
          DomainName: "fsxontap.com"
          FileSystemAdministratorsGroup: "Domain Admins"
          OrganizationalUnitDistinguishedName: "OU=Computers,OU=fsxontap,DC=fsxontap,DC=com"
          Password: !Ref EnvironmentPassword
          UserName: "Admin"
```
この部分はファイルシステムの上にADにJoinしたSVMを作成します
* ActiveDirectoryConfiguration
    * ここにADの情報を入力。
    * NetBiosNameにはADのNetBiosNameではなく、新しいことを設定します。
    * 今回作成されたドメインは"fsxontap.com"なので、OrganizationalUnitDistinguishedNameのところに"OU=Computers,OU=fsxontap,DC=fsxontap,DC=com"を指定するのが必須です。
  

# Reference
* [KeyPairの作成手順](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/create-key-pairs.html)
* [CIDRとは](https://www.nic.ad.jp/ja/basics/terms/cidr.html)
* [amazon-fsx-workshop](https://github.com/aws-samples/amazon-fsx-workshop/blob/master/netapp-ontap/templates/fsx-ontap-od-workshop.yaml#L257)
* [EC2 InstanceをAmazon Managed ADに自動JoinすることをCloudFormationでやってみた](https://qiita.com/Shengyu/private/476bc165a3795d5141db)
* [CloudFormationでFSx for NetApp ONTAPを作成してみた](https://qiita.com/Shengyu/private/617bb0c14bcf7180fe88)