この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
皆様こんにちは。
今回は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.構成図と作業フロー
EFS作成からマウントまでのフローは以下になります。
- 共有ファイルシステムであるEFSを作成します。
- マウントターゲットを作成し、ターゲットにはマウントするEC2インスタンスがあるパブリックサブネットを指定します。
- 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エラーが発生します。
- 「/etc/fstab」ファイルは、マウントするファイルシステムの情報を記述するファイルです。なので、
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
確認できました。
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