ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

Amazon EFS のスループットモードを自動で変更する仕組み

こんにちは、AWS チームの尾谷です。

昨日は、Amazon EFS のスループットモードの特徴と選び方などをまとめて ブログにまとめました 。今日は、バーストスループットモードとプロビジョンドスループットモードを AWS Lambda を使って自動で切り替える仕組みを考察しましたので、アウトプットします。

手動でモードを変更する

Lambda をコーディングする前に、手動によるモード変更のオペレーションと挙動を確認しておきます。

Elastic Throughput モードからバーストモードに変更

  1. EFS の [編集] ボタンをクリックし、スループットモードを [○ 拡張] から、
  2. [○ バースト] に変更しました。[変更を保存] ボタンをクリックすると、
  3. 数秒でスループットモードがバーストに変更されました。

バーストモードからプロビジョンドモードに変更

  1. バーストからプロビジョンドへの変更も試しておきました。[○ 拡張] を選択して、[○ プロビジョニング済み]、15MiB/秒 に変更しました。こちらも即時変更されました。

プロビジョンドモードからバーストモードに変更

  1. 最後に、プロビジョンドモードに変更した直後に、さらにバーストモードに変更しようとしたらエラーになりました。

昨日のブログにも記載しましたが変更回数に制限があります。
変更は即時可能ですが、一度プロビジョンドモードにすると次の変更まで 24 時間の間隔が必要です。

https://repost.aws/ja/knowledge-center/efs-max-throughput-mode-changes

Lambda でモードを変更する

挙動が確認できたので、手動の変更作業を Lambda で再現します。

  1. arm64 で Lambda 関数を作成しました。
  2. まずは、バースト → プロビジョンドのテストから。
  3. エラーなく実行できました。
  4. EFS がバーストから、プロビジョニング済み (15 MiB/秒) に変わりました。
  5. 次は、プロビジョンド → バーストのテスト。
  6. 24 時間の間隔をあけておらず、[TooManyRequests] エラーになりました。

CloudWatch アラームで Lambda をトリガー

Lambda の単体検証が終わったので、次は CloudWatch アラームを設定してみます。

SNS トピックの作成

Lambda トリガーに利用する SNS トピックから作成しました。

  1. スタンダードトピックで、任意の名前をつけてトピックを作成しました。
  2. [サブスクリプションの作成] ボタンをクリックし、
  3. Lambda の ARN を指定して、サブスクリプションを作成しました。

CloudWatch Alarm の設定

  1. CloudWatch Alarm は 5 分の最小を指定して、100,000,000,000 以下になったらトリガーするアラームを設定しました。
  2. アラームのトリガーのみを設定します。
  3. 復旧は、2,100,000,000,000 以下になったらというしきい値で、OK のみトリガーを設定しました。
  4. 以下のような形です。

Lambda 関数を作成

Lambda は以下のようにコーディングしました。

import boto3
import os

client = boto3.client('efs')

def lambda_handler(event, context):

    burst_on = False
    privisioned_on = False

    try:
        burst_on = 'OK' in event.get('Records')[0].get('Sns').get('Subject')
        privisioned_on = 'ALARM' in event.get('Records')[0].get('Sns').get('Subject')
    except:
        print('ERROR')
        return

    if burst_on:
        response = client.update_file_system(
            FileSystemId = os.environ['AMAZONEFS_FILESYSTEM_ID'],
            ThroughputMode='bursting'
        )
    elif privisioned_on:
        response = client.update_file_system(
            FileSystemId = os.environ['AMAZONEFS_FILESYSTEM_ID'],
            ThroughputMode='provisioned',
            ProvisionedThroughputInMibps=15.0
        )

EFS のファイルシステム ID は環境変数に入れました。

動作確認

最後に試験を行います。

  1. 100 GiB というしきい値は、再現させるのに時間がかかるため、OK: 2,200,000,000,000 と ALARM: 2,180,000,000,000 で試してみます。
  2. 現在、バーストモードですが、
  3. 昨日のブログ で作ったループ Shell スクリプトを実行すると、
  4. 開始 2 分程度でスループット利用率の上昇が確認でき
  5. アラーム状態になると、プロビジョンドスループットに変わりました。

まとめ

いかがでしたでしょうか。
Amazon EFS はフルマネージドなストレージサービスで、利用することに専念できる素晴らしいサービスです。
一方で、しっかり理解しないと高額請求になったり、パフォーマンスが落ちるなど落とし穴がたくさんある印象です。
昨日のブログ と本ブログが、ファイルサーバー運用の参考になれば幸いです。

ありがとうございました。