Terraformで実装するAWSファイルストレージ入門:EFSとFSxを構築してみた

こんにちは、SCSKの坂木です。

クラウドを活用する上で、ファイルストレージの選定は重要なテーマの一つです。「複数のサーバーからアクセスできる共有ストレージが欲しい」「Windowsのファイルサーバーをクラウドに移行したい」といったニーズは尽きません。

AWSにはその答えとして、Amazon EFS と Amazon FSx という強力なマネージドサービスが用意されています。

この記事では、IaC (Infrastructure as Code) ツールである Terraform を使い、これら2つのサービスを実際に構築してみます。

 

Terraformについて

Terraformはインフラをコードで管理するためのIaCツールです。AWSのwebインタフェースを何度もクリックする代わりに、サーバやストレージの構成をコードとして記述します。

これにより、誰が実行しても全く同じ環境を正確に再現でき、コードをGitなどでバージョン管理することも可能になります。

今回はAWSを対象としますが、TerraformはAzureやGoogle Cloudといった他のクラウドでも全く同じ書き方でインフラを管理できます。

Terraform | HashiCorp Developer
Explore Terraform product documentation, tutorials, and examples.

 

Elastic File Systemについて

Amazon EFS (Elastic File System) は、主にLinux向けのファイルストレージです。

Amazon EFSの最大の特徴は、データ量に応じてストレージ容量が自動で拡張・縮小できる点です。
NFSプロトコルで接続し、複数のサーバーから同時にアクセスできるため、Webサーバのコンテンツ共有やデータ分析基盤に適しています。

Amazon Elastic File System とは - Amazon Elastic File System
Amazon Elastic File System (Amazon EFS) は、ファイルデータを共有できるサーバーレスで伸縮自在なファイルストレージを提供します。すべてのファイルストレージインフラストラクチャは、サービスによって管理され...

 

FSx for Windows File Serverについて

Amazon FSx for Windows File Serverは、Windows環境に特化したファイルストレージです。

SMBプロトコルで接続し、Active Directoryと連携します。これにより、従来のWindowsサーバと同様に、ユーザ・グループ単位でのアクセス権設定やシャドウコピーといったネイティブ機能を利用できるのが大きな魅力です。

FSx for Windows ファイルサーバーとは? - Amazon FSx for Windows File Server
で Microsoft Windows ワークロードの共有ファイルストレージを簡単に起動および実行できる AWS サービスである FSx for Windows File Server について説明します AWS クラウド。

 

EFSの構築

今回構築するEFSの設定は下表のとおりです。
サブネットとセキュリティグループは既存のものを利用するため、これらは事前に作成しておいてください。

設定項目 設定値
名前 Iac-efs
デプロイ 1ゾーン (ap-northeast-1a に作成)
保管時のデータ暗号化 有効
スループットモード バースト
自動バックアップ 有効
サブネット subnet-xxxxxxxxxxxxxxxxx(作成済みのものを指定)
セキュリティグループ sg-xxxxxxxxxxxxxxxxxx(作成済みのものを指定)

 

terrformのコードは以下の2つを作成します。

  • main.tf(作成したいリソースの構成を定義するファイル)
  • provider.tf(接続先のサービスや、その接続情報を定義するファイル)
▼main.tf
# EFS ファイルシステム
resource "aws_efs_file_system" "iac_efs" {
creation_token = "Iac-efs"
encrypted = true
performance_mode = "generalPurpose"
throughput_mode = "bursting"
availability_zone_name = "ap-northeast-1a"
tags = {
Name = "Iac-efs"
}
}

# 自動バックアップ設定(有効化)
resource "aws_efs_backup_policy" "iac_efs_backup" {
file_system_id = aws_efs_file_system.iac_efs.id
backup_policy {
status = "ENABLED"
}
}

# マウントターゲット
resource "aws_efs_mount_target" "iac_efs_mt" {
file_system_id = aws_efs_file_system.iac_efs.id
subnet_id = "subnet-xxxxxxxxxxxxxxxxx" 
security_groups = ["sg-xxxxxxxxxxxxxxxxxx"]
}

 

▼provider.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.10.0"
}
}
}

provider "aws" {
region = "ap-northeast-1"
}

 

main.tfとprovider.tfを同じフォルダに配置し、以下のコマンドを実行してリソースをデプロイします。

>terraform init
#Terraformの初期化を行います。
#「Terraform has been successfully initialized!」と表示されれば成功です。

>terraform plan
#作成されるリソースの実行計画をプレビューします。
#「Plan: X to add, 0 to change, 0 to destroy.」のように表示されることを確認します。

>terraform apply
#planの内容でリソースを実際に作成します。
#「Apply complete! Resources: X added, ...」と表示されればデプロイ成功です。

 

AWSのインタフェースから、リソースが作成されていることを確認します。

 

EFSの動作確認

動作確認として、EC2①とEC2②の両方からEFSをマウントし、EC2①で作成したファイルがEC2②からも参照できるか検証します。

 

EC2①にログインし、「Hello, EFS!」と記載されたtest.txtを作成します。

▼EC①のコンソール
# yum install -y amazon-efs-utils
# mkdir /mnt/efs
# mount -t efs fs-xxxxxxxxxxxxxxxxx:/ /mnt/efs
# df -h /mnt/efs
Filesystem Size Used Avail Use% Mounted on
127.0.0.1:/ 8.0E 0 8.0E 0% /mnt/efs
# echo "Hello, EFS!" | sudo tee /mnt/efs/test.txt  ←ここでファイルを作成
Hello, EFS!
# cat /mnt/efs/test.txt
Hello, EFS!

 

EC2②で、EC2①で作成した「Hello, EFS!」と記載されたtest.txtが存在するか確認します。

▼EC2➁のコンソール
# yum install -y amazon-efs-utils
# mkdir /mnt/efs
# mount -t efs fs-xxxxxxxxxxxxxxxxx:/ /mnt/efs
# df -h /mnt/efs
Filesystem Size Used Avail Use% Mounted on
127.0.0.1:/ 8.0E 0 8.0E 0% /mnt/efs
# ls /mnt/efs/  ←ここでEC2➀で作成されたファイルが共有されたことを確認
test.txt
# cat /mnt/efs/test.txt
Hello, EFS!

こちらのようにファイルが共有されていることを確認できました。

 

FSxの構築

今回構築するFSxの設定は下表のとおりです。ADは Amazon Managed AD ではなく、自己管理型の Active Directory を利用します。
サブネットとセキュリティグループは既存のものを利用するため、これらは事前に作成しておいてください。

設定項目 設定値
名前 Iac-fsx
デプロイタイプ シングルAZ (ap-northeast-1a に作成)
ストレージタイプ SSD
ストレージ容量 32GB
スループットキャパシティ 32 MB/秒
サブネット subnet-xxxxxxxxxxxxxxxxx(作成済みのものを指定)
セキュリティグループ sg-xxxxxxxxxxxxxxxxxx(作成済みのものを指定)
認証タイプ セルフマネージド型 Microsoft Active Directory
完全修飾ドメイン名 test.local
DNS サーバーの IP アドレス 10.0.2.241
サービスアカウントのユーザー名 <Secrets Managerから取得したパスワード>
サービスアカウントのパスワード <Secrets Managerから取得したパスワード>
組織単位 (OU) OU=FSx,DC=test,DC=local
ファイルシステム管理者グループ Domain Admins
毎日の自動バックアップ 有効
自動バックアップ保持期間 7日
毎日の自動バックアップウィンドウ 03:00 (UTC)

 

AD管理者のログイン情報は AWS Secrets Manager で管理するため、シークレットも作成します。

設定項目 設定値
シークレット名 Iac_fsx_secret
ユーザー名 Administrator
パスワード XXXXXXXXXX

 

terrformのコードは以下の2つを作成します。provider.tfはEFS作成時と同じものを利用します。

  • main.tf
  • provider.tf
▼main.tf
# ---------------------------------------------------------------------
# Secrets Manager
# ---------------------------------------------------------------------
# 1. シークレットの器を作成
resource "aws_secretsmanager_secret" "fsx_ad_secret" {
name = "Iac_fsx_secret"
tags = {
Name = "Iac_fsx_secret"
}
}

# 2. シークレットの値を設定
resource "aws_secretsmanager_secret_version" "fsx_ad_secret_version" {
secret_id = aws_secretsmanager_secret.fsx_ad_secret.id
secret_string = jsonencode({
username = "Administrator"
password = "XXXXXXXXXX"
})
}

# 3. JSON から "username" と "password" を個別に抽出
locals {
# 作成したリソースを参照するように変更
ad_credentials = jsondecode(aws_secretsmanager_secret_version.fsx_ad_secret_version.secret_string)
}

# ---------------------------------------------------------------------
# FSx for Windows File System
# ---------------------------------------------------------------------
resource "aws_fsx_windows_file_system" "iac_fsx" {
storage_capacity = 32
storage_type = "SSD"
throughput_capacity = 32
deployment_type = "SINGLE_AZ_1"

subnet_ids = ["subnet-xxxxxxxxxxxxxxxxx"]
security_group_ids = ["sg-xxxxxxxxxxxxxxxxxx"]

self_managed_active_directory {
dns_ips = ["10.0.2.241"]
domain_name = "test.local"
username = local.ad_credentials.username # JSONから抽出
password = local.ad_credentials.password # JSONから抽出
organizational_unit_distinguished_name = "OU=FSx,DC=test,DC=local"
file_system_administrators_group = "Domain Admins"
}

automatic_backup_retention_days = 7
daily_automatic_backup_start_time = "03:00"
tags = {
Name = "Iac-fsx"
}
}

 

main.tfとprovider.tfを同じフォルダに配置し、以下のコマンドを実行してリソースをデプロイします。

>terraform init 
#Terraformの初期化を行います。
#「Terraform has been successfully initialized!」と表示されれば成功です。 

>terraform plan 
#作成されるリソースの実行計画をプレビューします。 
#「Plan: X to add, 0 to change, 0 to destroy.」のように表示されることを確認します。

>terraform apply 
#planの内容でリソースを実際に作成します。 
#「Apply complete! Resources: X added, ...」と表示されればデプロイ成功です。

 

AWSのインタフェースから、リソースが作成されていることを確認します。

 

FSxの動作確認

動作確認として、EC2①とEC2②の両方からFSxをマウントし、EC2①で作成したファイルがEC2②からも参照できるか検証します。
このとき、EC2➀と②はFSxと同じドメインに属している必要があります。

 

EC2インスタンス①と②のそれぞれで、以下のnet useコマンドを実行してFSxをマウントします。

コマンド実行後、ドメイン管理者のユーザ名とパスワードの入力を求められるので、入力してください。
「The command completed successfully.」と表示されれば、マウントは成功です。

C:\Users\Administrator>net use Z: \\amznfsxlerptxpk.test.local\share

Enter the user name for 'amznfsxlerptxpk.test.local': Administrator@test.local
Enter the password for amznfsxlerptxpk.test.local:
The command completed successfully.

 

EC2①で、testfile.txtを作成します。

 

EC2②で、EC2①で作成したtestfile.txtが存在するか確認します。

こちらのようにファイルが共有されていることを確認できました。

 

作成したリソースの削除

Terraformで作成したリソースは、コマンド一つで簡単にクリーンアップできます。

EFSやFSxのmain.tfファイルが保存されているディレクトリで、以下のコマンドを実行します。

>terraform destroy

※本番環境など、重要なリソースが含まれるディレクトリで誤って実行しないよう、コマンドを実行する際はカレントディレクトリを十分に確認してください。

 

まとめ

本記事では、Terraformを使い、AWSが提供する2つの主要なマネージドファイルストレージであるAmazon EFSAmazon FSx for Windows File Serverを構築する手順を解説しました。

  • Amazon EFSは、Linux環境での利用に適した、伸縮自在なファイルストレージです。NFSプロトコルで複数のEC2インスタンスから簡単にマウントして利用できます。
  • Amazon FSxは、Windowsネイティブの機能をフル活用できるサービスです。Active Directoryと連携し、従来のオンプレミスファイルサーバと同じ感覚で利用できます。

TerraformというIaCツールを利用することで、このようなインフラ環境をコードとして定義し、誰でも・何度でも同じ構成を正確に再現できるメリットを実感いただけたかと思います。

今回のコードをベースに、バックアップ戦略のカスタマイズやライフサイクルポリシーの設定など、より高度な機能にもぜひ挑戦してみてください。この記事が、皆さんのAWS環境構築の効率化の一助となれば幸いです。

 

▼ AWSに関するおすすめ記事

【Amazon Bedrock】ナレッジベースを用いた社内資料管理ーめざせ生産性向上ー
社内資料の管理、効率的ですか?様々な形式の文書が散在し、必要な情報を探すのに時間を取られていませんか? ファイルサーバーの奥底に埋もれどこにあるか分からない、バージョン管理が混乱する、などといった課題を抱えていませんか?これらの非効率は、業務の生産性低下に直結します。 今こそ、社内資料の一元管理体制を見直しましょう!ということで、AWS Bedrockのナレッジベースを用いた資料の一括管理およびその検索方法をご紹介します!
AWS DataSync を用いて Amazon EC2 の共有フォルダを Amazon FSx に転送してみた
本記事では、ファイルサーバーのデータを Amazon FSx へ移行するシナリオを想定し、AWS DataSync を使った具体的な設定手順をスクリーンショットを交えながら、一つひとつ丁寧に解説していきます。
著者について

保有資格:健康マスター, FP3級
健康リテラシーと金融リテラシーの高さが強みのエンジニアです

坂木をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSクラウド
シェアする
タイトルとURLをコピーしました