皆様こんにちは。
今回はCloudFormationを利用して高可用性アーキテクトの構築をしていきます。
この記事ではCloudFormationよりEFSの作成を行います。
このブログはCloudFormationによるEFSの作成をする上での知識を記事としてまとめ再確認し、皆様と共有するため作成します。
※今回から命名[hebiishi]となっているものは[ut]になります。ご了承ください。

1.高可用性アーキテクト構築目次

目次はこちら

2.EFSとは

Amazon Elastic File System (Amazon EFS) は、シンプルなサーバーレスで、 set-and-forget で使用する Elastic ファイルシステムAWS クラウドサービスとオンプレミスリソース。アプリケーションを停止させることなく、オンデマンドでペタバイト規模までスケールするよう設計されており、ファイルの追加や削除に応じて自動的に拡張/縮小されるため、拡張に対応するための容量のプロビジョニングや管理は不要になります。
参照:Amazon Elastic File System とは

今回は高可用性アーキテクトを構築していくうえで二つのEC2インスタンスの共有ファイルシステムとしてEFS利用します。

類似のストレージサービスとしては「Amazon S3」や「Amazon FSx」等があげられます。

3.構成図と作業フロー

file
EFS作成からマウントまでのフローは以下になります。

  1. 共有ファイルシステムであるEFSを作成します。
  2. マウントターゲットを作成し、ターゲットにはマウントするEC2インスタンスがあるパブリックサブネットを指定します。
  3. EC2インスタンスにEFSをマウントします。具体的マウント方法は以下のコマンドを参考にしてください。(これらは後にEC2のユーザーデータにまとめ、EC2作成時に自動で設定できるようにしています。)
sudo yum install -y amazon-efs-utils
sudo mount -t efs -o tls fs-xxxxx:/ /var/www/html/
echo 'fs-xxxxx:/ /var/www/html efs tls,_netdev 0 0' | sudo tee -a /etc/fstab
  • 1行目 sudo yum install -y amazon-efs-utilsは、
    EFSマウントヘルパーのインストールです。

    • -yは全ての問い合わせに「yes」で応答するオプションです。
  • 2行目sudo mount -t efs -o tls fs-xxxxx:/ /var/www/html/は、
    EFSのマウントコマンドです。fs-xxxxxは自分のefsIDを設定します。

    • -o tlsはtlsを利用して暗号化するコマンドです。
  • 3行目echo 'fs-xxxxx:/ /var/www/html efs tls,_netdev 0 0' | sudo tee -a /etc/fstabについて、
    インスタンスの再起動時に、EFSを自動マウントするためのコマンドです。なので、fs-xxxxxを自分のefsIDに書き換える必要があります。

    • 「/etc/fstab」ファイルは、マウントするファイルシステムの情報を記述するファイルです。なので、fs-xxxxx:/ /var/www/html efs tls,_netdev 0 0を書き込む事で起動時に自動マウント設定を行えます。
    • sudo echo で直接書き込もうとするとリダイレクト処理が挟まって一般ユーザー権限になり、Permission deniedエラーが発生します。

4.EFS構築

EFSの構築の全体のソースコードは下記の通りです。
ファイル名「ut-EFS-CF」

AWSTemplateFormatVersion: "2010-09-09"
Resources:
#EFS作成
  FileSystemResource:
    Type: "AWS::EFS::FileSystem"
    Properties:
      Encrypted: true
      KmsKeyId: !ImportValue ut-KMS-Arn
      FileSystemTags: 
      - 
        Key: "Name"
        Value: "ut-EFS"

#マウントターゲット作成
  MountTargetResource1:
    Type: "AWS::EFS::MountTarget"
    Properties:
      FileSystemId: !Ref FileSystemResource
      SecurityGroups: 
      - !ImportValue ut-SG-EFS-id
      SubnetId: !ImportValue ut-pubsubnet-1-id

  MountTargetResource2:
    Type: "AWS::EFS::MountTarget"
    Properties:
      FileSystemId: !Ref FileSystemResource
      SecurityGroups: 
      - !ImportValue ut-SG-EFS-id
      SubnetId: !ImportValue ut-pubsubnet-2-id

EFS作成部分のソースコードとマウントターゲット作成部分のソースコードをそれぞれ説明していきます。

4-1.EFS作成

EFSの作成をしていきます、EFSの作成のソースコードは下記の通りです。

#EFS作成
  FileSystemResource:
    Type: "AWS::EFS::FileSystem"
    Properties:
      Encrypted: true
      KmsKeyId: !ImportValue ut-KMS-Arn
      FileSystemTags:
      -
        Key: "Name"
        Value: "ut-EFS"

設定項目は下記の通りです。

使用するオプション 設定値 説明
Encrypted true 暗号の有効化
KmsKeyId !ImportValue ut-KMS-Arn 暗号化鍵のARNを参照
FileSystemTags Key=Name,Value=ut-EFS 設定したいタグを入力

これでEFS作成のソースコードの説明は以上です。

4-2.マウントターゲット

次にマウントターゲットを設定していきます。

4-2-1.マウントターゲットとは

マウントターゲットは、Amazon EFS ファイルシステムをマウントできる NFSv4 エンドポイントの IP アドレスを提供します。Domain Name Service (DNS) 名を使用してファイルシステムをマウントします。そうすると EC2 インスタンスと同じアベイラビリティーゾーンの EFS マウントターゲットの IP アドレスとして解決されます。AWS リージョンのアベイラビリティーゾーンごとに 1 つのマウントターゲットを作成できます。VPC のアベイラビリティーゾーンに複数のサブネットがある場合、サブネットの 1 つにマウントターゲットを作成します。次に、アベイラビリティーゾーンのすべての EC2 インスタンスがそのマウントターゲットを共有します。
参照:Amazon EFS: 仕組み

4-2-2.マウントターゲット作成

マウントターゲットには二つのパブリックサブネットを登録します。
ソースコードは下記の通りです。

#マウントターゲット作成
  MountTargetResource1:
    Type: "AWS::EFS::MountTarget"
    Properties:
      FileSystemId: !Ref FileSystemResource
      SecurityGroups:
      - !ImportValue ut-SG-EFS-id
      SubnetId: !ImportValue ut-pubsubnet-1-id

  MountTargetResource2:
    Type: "AWS::EFS::MountTarget"
    Properties:
      FileSystemId: !Ref FileSystemResource
      SecurityGroups:
      - !ImportValue ut-SG-EFS-id
      SubnetId: !ImportValue ut-pubsubnet-2-id

設定項目は下記の通りです。

使用するオプション 設定値 説明
FileSystemId !Ref FileSystemResource EFSのIDを参照
SecurityGroups !ImportValue utSG-EFS-id EFS用のSGのIDを参照
SubnetId !ImportValue ut-pubsubnet-1-id
!ImportValue ut-pubsubnet-2-id
パブリックサブネットのIDを参照

マウントターゲットの設定ができました。

これでマウントターゲットのソースコードの説明を終わります。

5.EFS検証

スタック作成後、構築されたEFSが機能してるかの検証をしていきます。
※こちらの検証はEC2構築後に検証しています

プライベートIP10.0.1.10のインスタンスでテストファイルを作成して、プライベートIP10.0.2.20のインスタンで確認できるかのテストをします。

①まず両方のインスタンスがEFSにマウントしたディレクトリに移動したいため、以下のコマンドを利用します。

cd /var/www/html

②プライベートIP10.0.1.10のインスタンスでテストファイルを以下のコマンドで作成します。

sudo touch test.txt

③最後にプライベートIP10.0.2.20のインスタンスで以下のコマンドを利用してファイルを確認します。

ls test.txt

file
確認できました。

6.感想

特に問題なく構築できました、EFSの検証も見ていただけると光栄です。

7.参照

AWS CloudFormation – AWS::EFS::FileSystem
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html
AWS CloudFormation – AWS::EFS::MountTarget
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-mounttarget.html

Last modified: 2022-06-22

Author