【AWS CLI】Amazon FSx for Windows File Serverの古いファイルをAmazon S3にエクスポートしてみた

AWS

2023.12.25

Topics

こんにちは。kisaragi です。
この記事では、FSxの古いファイルをS3にエクスポートする方法について解説していきます。

この記事で何が得られる?


古いファイルのせいでディスク容量が足りない…
とはいえ、ディスク容量を大きくすると、コストもかさむし…

そういった時、解決できる方法を解説していきます。

前提 / 環境

  • Windows Server 2019 Base
    • ami-0a15fc610e3955298
  • AWS CLI 接続できていること
    • Windows Powershell
    • S3関連権限があること
  • FSxがマウント済みであること

コード全体像

$fsxPath = "\\FSxServer\share"
$s3Bucket = "your-s3-bucket-name"
$region = "ap-northeast-1"

$cutoffDate = (Get-Date).AddMinutes(-10)
$items = Get-ChildItem -Path $fsxPath -Recurse -File | Where-Object { $_.LastAccessTime -lt $cutoffDate }
$items = $items | Sort-Object { ($_.FullName -split "\\").Count } -Descending

foreach ($item in $items) {
    $s3Key = $item.FullName.Replace($fsxPath, "").Replace("\", "/")
    $s3Uri = "s3://$s3Bucket$s3Key"
    Write-Output "Copying $($item.FullName) to $s3Uri"
    aws s3 mv "$($item.FullName)" "$s3Uri" --region $region

    $folderItems = Get-ChildItem -Path $item.PSParentPath
    if ($folderItems.Count -eq 0) {
        Write-Output "Folder is empty. Deleting $($item.PSParentPath)"
        Remove-Item -Path $item.PSParentPath -Force
    }
}

コード解説

以下のサンプルコードを参考にして入力してください。

▼ 変数を指定

# FSxのパスを入力
$fsxPath = "\\fs-0919xxxxxxxxxxxxx.NHNTechorus.local\share"

# S3バケット名を入力
$s3Bucket = "xxxxx-bucket-test-fsxcopy"

# リージョンを入力
$region = "ap-northeast-1"

▼ cutoffDate変数に時間を指定

$cutoffDate = (Get-Date).AddMinutes(-10) # 10分

$cutoffDate = (Get-Date).AddDays(-5):5日
$cutoffDate = (Get-Date).AddMonths(-3):3ヶ月
$cutoffDate = (Get-Date).AddYears(-1):1年

▼ items変数にファイルを収納

# 最後にアクセスされた時間から10分以上のもの
$items = Get-ChildItem -Path $fsxPath -Recurse -File | Where-Object { $_.LastAccessTime -lt $cutoffDate }

-lt : 指定時間より古いファイル
-gt : 指定時間より新しいファイル
$_.LastAccessTime : 最後にアクセスした時間
$_.LastWriteTime : 最後に修正した時間
$_.CreationTime : ファイルが作られた時間

▼ 配下フォルダーから処理を行うためにsort

$items = $items | Sort-Object { ($_.FullName -split "\\").Count } -Descending

▼ WindowsからS3へエクスポート

foreach ($item in $items) {
    $s3Key = $item.FullName.Replace($fsxPath, "").Replace("\", "/")
    $s3Uri = "s3://$s3Bucket$s3Key"
    Write-Output "Copying $($item.FullName) to $s3Uri"
    aws s3 mv "$($item.FullName)" "$s3Uri" --region $region

    $folderItems = Get-ChildItem -Path $item.PSParentPath
    if ($folderItems.Count -eq 0) {
        Write-Output "Folder is empty. Deleting $($item.PSParentPath)"
        Remove-Item -Path $item.PSParentPath -Force
    }
}

注意点

aws s3 mv コマンドはS3へのエクスポート後、Windowsのファイルが削除されてしまいます。
もし、S3へのエクスポート後にもWindowsにファイルを残したい場合はaws s3 cpをご利用ください。

foreach ($item in $items) {
    $s3Key = $item.FullName.Replace($fsxPath, "").Replace("\", "/")
    $s3Uri = "s3://$s3Bucket$s3Key"
    Write-Output "Copying $($item.FullName) to $s3Uri"
    aws s3 cp "$($item.FullName)" "$s3Uri" --region $region
}

実行

▼ Windows Powershellを実行


画像を参考にして書いたコードを入力してください。


コードを実行すると、画像のようにメッセージが出力されます。

FSxの中身

エクスポート後S3の中身

FSxからS3バケットへのエクスポートが完了しました。

さいごに

今回はFSxを使用してS3へエクスポートを行いましたが、Windowsのパスならどこにでも活用できます。

$fsxPath = "\\FSxServer\share" → "C:\your_folder"

運用上、ストレージのディスク容量で悩んでしまう時がありますね。
S3は容量無制限の優れたストレージサービスです。
ストレージからS3への条件エクスポートでディスク容量を軽くしてみませんか。

ディスク容量で悩んでいる方に少しでも役立てたら嬉しいです。

kisaragi

2023年度新卒入社。クラウドエンジニア。出身は韓国です。 2月生まれの「如月」です。宜しくお願い致します。 尊敬するエンジニア:waka、Cold-Airflowさん

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら