こんにちは、SCSKの坂木です。
クラウドを活用する上で、ファイルストレージの選定は重要なテーマの一つです。「複数のサーバーからアクセスできる共有ストレージが欲しい」「Windowsのファイルサーバーをクラウドに移行したい」といったニーズは尽きません。
AWSにはその答えとして、Amazon EFS と Amazon FSx という強力なマネージドサービスが用意されています。
この記事では、IaC (Infrastructure as Code) ツールである Terraform を使い、これら2つのサービスを実際に構築してみます。
Terraformについて
Terraformはインフラをコードで管理するためのIaCツールです。AWSのwebインタフェースを何度もクリックする代わりに、サーバやストレージの構成をコードとして記述します。
これにより、誰が実行しても全く同じ環境を正確に再現でき、コードをGitなどでバージョン管理することも可能になります。
今回はAWSを対象としますが、TerraformはAzureやGoogle Cloudといった他のクラウドでも全く同じ書き方でインフラを管理できます。

Elastic File Systemについて
Amazon EFS (Elastic File System) は、主にLinux向けのファイルストレージです。
Amazon EFSの最大の特徴は、データ量に応じてストレージ容量が自動で拡張・縮小できる点です。
NFSプロトコルで接続し、複数のサーバーから同時にアクセスできるため、Webサーバのコンテンツ共有やデータ分析基盤に適しています。
FSx for Windows File Serverについて
Amazon FSx for Windows File Serverは、Windows環境に特化したファイルストレージです。
SMBプロトコルで接続し、Active Directoryと連携します。これにより、従来のWindowsサーバと同様に、ユーザ・グループ単位でのアクセス権設定やシャドウコピーといったネイティブ機能を利用できるのが大きな魅力です。
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 EFSとAmazon FSx for Windows File Serverを構築する手順を解説しました。
- Amazon EFSは、Linux環境での利用に適した、伸縮自在なファイルストレージです。NFSプロトコルで複数のEC2インスタンスから簡単にマウントして利用できます。
- Amazon FSxは、Windowsネイティブの機能をフル活用できるサービスです。Active Directoryと連携し、従来のオンプレミスファイルサーバと同じ感覚で利用できます。
TerraformというIaCツールを利用することで、このようなインフラ環境をコードとして定義し、誰でも・何度でも同じ構成を正確に再現できるメリットを実感いただけたかと思います。
今回のコードをベースに、バックアップ戦略のカスタマイズやライフサイクルポリシーの設定など、より高度な機能にもぜひ挑戦してみてください。この記事が、皆さんのAWS環境構築の効率化の一助となれば幸いです。
▼ AWSに関するおすすめ記事








