TerraformでEFSを作成


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

皆様こんにちは。
Terraformを利用して、AWSで高可用性アーキテクトの構築をしていきます。
今回はEFSを作成していきます。

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

目次はこちら

2.EFSの概要

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

引用元:Amazon Elastic File System とは

EFSは、容量無制限で複数のEC2インスタンスから同時にアクセスが可能なファイルストレージサービスです。
EFSは多種多様なユースケースに対応できるよう、パフォーマンスモードやスループットモードといったモードが用意されています。

EFSのパフォーマンスモード

下記の2つの種類があります。

  • 汎用パフォーマンスモード
  • 最大I/Oパフォーマンスモード

ほとんどの場合、汎用パフォーマンスモードの使用で問題ありません。
ただし、数100~数1000台といったクライアントから同時にEFSにアクセスがある場合にも耐えられるように、最大I/Oパフォーマンスモードが用意されています。
パフォーマンスモードはあとから変更できないので、導入前によく検討しなければなりません。
どちらのモードを選択するのがよいかを見分ける指標として、CloudWatchのPercentIOLimitメトリクスが参考になります。
詳細はこちらのドキュメントを参照ください

EFSのスループットモード

下記の2種類があります。

  • バーストスループットモード
  • プロビジョニングスループットモード

スループットモードの選択には、CloudWatchのBurstCreditBalanceメトリクスが参考になります。クレジットバランスをすべて使い切ってしまったり、常に減少傾向である場合はプロビジョニングスループットモードを選択しましょう。
詳細はこちらのドキュメントを参照ください。

3.構成図

下記は今回作成するEFSのフロー図です。

  1. EFSを作成します。
  2. マウントターゲットを作成し、ターゲットはAZ1a、1cのパブリックサブネットを指定します(EC2インスタンスにマウントしたいため)。
  3. EC2インスタンスにEFSをマウントします。

「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

上記のコードでEFSマウントヘルパーのインストール、EFSのマウント、インスタンスの再起動時に、EFSを自動マウントを設定しています。

4.EFSの作成

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

#--------------------------------------
# EFSの作成
#----------------------------------------

resource "aws_efs_file_system" "higa-EFS" {

  encrypted  = "true"
  kms_key_id = "arn:aws:kms:ap-southeast-1:アカウントID:key/e0b1110b-a12e-4a63-a87e-5b838d15ab4c"

  tags = {
    Name = "higa-EFS"
  }
}

#マウントターゲットの作成
//マウントターゲット1a(higa-Public-subnet-1a)
resource "aws_efs_mount_target" "higa-EFS-1a" {
  file_system_id  = aws_efs_file_system.higa-EFS.id
  subnet_id       = aws_subnet.higa-Public-subnet-1a.id
  security_groups = [aws_security_group.higa-EFS-sg.id]
}

//マウントターゲット1c(higa-Public-subnet-2c)
resource "aws_efs_mount_target" "higa-EFS-1c" {
  file_system_id  = aws_efs_file_system.higa-EFS.id
  subnet_id       = aws_subnet.higa-Public-subnet-2c.id
  security_groups = [aws_security_group.higa-EFS-sg.id]
}

4-1.ファイルシステムの作成

ファイルシステムを作成していきます。
ソースコードは下記の通りです。(5~13行目)

resource "aws_efs_file_system" "higa-EFS" {

  encrypted  = "true"
  kms_key_id = "arn:aws:kms:ap-southeast-1:[アカウントID]:key/e0b1110b-a12e-4a63-a87e-5b838d15ab4c"

  tags = {
    Name = "higa-EFS"
  }
}

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

使用するオプション 設定値 説明
encrypted true 暗号化を有効化
kms_key_id arn:aws:kms:ap-southeast-1:[アカウントID]:key/e0b1110b-a12e-4a63-a87e-5b838d15ab4c 自分のKMSキーのarn
tags Name = "higa-EFS" EFSの表示名

これでファイルシステムが作成できました。

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

次に作成したファイルシステムにアクセスするために、AZごとにパブリックサブネットを指定して(EC2インスタンスにマウントしたいため)、マウントターゲットを作成します。

ソースコードは下記の通りです。(15~28行目)

#マウントターゲットの作成
//マウントターゲット1a(higa-Public-subnet-1a)
resource "aws_efs_mount_target" "higa-EFS-1a" {
  file_system_id  = aws_efs_file_system.higa-EFS.id
  subnet_id       = aws_subnet.higa-Public-subnet-1a.id
  security_groups = [aws_security_group.higa-EFS-sg.id]
}

//マウントターゲット1c(higa-Public-subnet-2c)
resource "aws_efs_mount_target" "higa-EFS-1c" {
  file_system_id  = aws_efs_file_system.higa-EFS.id
  subnet_id       = aws_subnet.higa-Public-subnet-2c.id
  security_groups = [aws_security_group.higa-EFS-sg.id]
}

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

使用するオプション 設定値 説明
file_system_id aws_efs_file_system.higa-EFS.id 自分のファイルシステムを指定
subnet_id aws_subnet.higa-Public-subnet-1a.id
aws_subnet.higa-Public-subnet-2c.id
パブリックサブネットを指定
security_groups [aws_security_group.higa-EFS-sg.id] EFS用に作成したSGを指定

これでマウントターゲットの作成ができました。

5.検証

5-1.1台目のEC2インスタンスに接続

Tera Termを使ってhiga-ec2-1に接続します。

5-2.ディレクトリに移動

次に下記コマンドで両方のインスタンスがEFSにマウントしたディレクトリに移動します。
cd /var/www/html

[ec2-user@ip-10-0-1-10 ~]$ cd /var/www/html
[ec2-user@ip-10-0-1-10 html]$

5-3.テストファイルの作成

sudo touch higa-test.txtコマンドで「higa-test.txt」ファイルを作成し、lsコマンドで確認します。

[ec2-user@ip-10-0-1-10 html]$ sudo touch higa-test.txt
[ec2-user@ip-10-0-1-10 html]$ ls higa-test.txt
higa-test.txt

テストファイルが作成できたことが確認できました。

5-4.2台目のEC2インスタンスで確認

「5-1」と同じようにhiga-ec2-2にログインし、ls higa-test.txtコマンドで確認します。

2代目のEC2インスタンス(higa-ec2-2)でもテストファイルが確認できました。

6.まとめ

EFSの作成はTerraformの公式ドキュメントを参考に、特に問題なく作成できました。
しかし検証が上手くいかず、原因はEFSのユーザーデータの設定を1台目のEC2インスタンスは設定していたのですが、2台目は設定を忘れていたので、検証が上手くいきませんでした。
当然のことですが、設定に抜けている部分がないか確認することは大切だと感じました。

7.参考文献

Last modified: 2022-06-24

Author