0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CloudWatchとAWS Lambdaを用いてAmazon EFSのスループットモード変更を自動化してみた

Posted at

はじめに

業務で使用しているAmazon EFSBurstCreditBalanceが2週間程度で枯渇するため、これまではその都度手動でスループットモードを変更するという対応を取っていたのですが、CloudWatchAWS Lambdaを用いて対応を自動化してみましたのでその際に設定した内容を記します。

注意事項

  • この記事の内容は執筆時点のものであるため、最新の設定方法とは異なっている可能性があります。
  • 入力が任意の設定項目については記載を割愛している場合があります。
  • 自身の備忘録も兼ねて記載しているので内容の誤りや、より効率的に実現する方法がある可能性があります。気になる点などがありましたらお気軽にコメントいただけますと幸いです。。。!

やったこと

  1. Amazon SNS - トピック作成
  2. CloudWatch - アラーム作成
  3. AWS Lambda - 関数作成
  4. IAM - 許可ポリシー追加

Amazon SNS

Lambda関数を実行させるトリガとしてトピックを2つ作成しました。

トピックの名前 トピックの用途
EFS-to-bursting EFSのスループットモードをバーストに変更するLambda関数のトリガ
EFS-to-provisioned EFSのスループットモードをプロビジョニング済みに変更するLambda関数のトリガ

作成手順

  1. AWSマネジメントコンソールよりAmazon SNS コンソールにアクセス
  2. 左のサイドメニューよりトピックをクリック
  3. 画面右側のトピックの作成をクリック
  4. 以下の通り設定し、トピックの作成をクリック
    • 詳細
      • タイプ: スタンダード
      • 名前: <上記表の名前>

CloudWatch

Amazon EFSBurstCreditBalanceが閾値を下回った時と回復した時に、前述の手順で作成したトピックに対して通知されるようにアラームを2つ作成しました。

アラームの名前 アラームの用途
EFS BurstCreditBalance is under threshold BurstCreditBalanceが閾値を下回った時にEFSのスループットモードをプロビジョニング済みに変更する際に使用するアラーム
EFS BurstCreditBalance returned to the threshold BurstCreditBalanceが閾値を上回った(回復した)時にEFSのスループットモードをバーストに変更する際に使用するアラーム

作成手順

プロビジョニング済みに変更するアラーム (EFS BurstCreditBalance is under threshold)

  1. AWSマネジメントコンソールよりCloudWatch コンソールにアクセス

  2. 左のサイドメニューよりすべてのアラームをクリック

  3. 画面右側のアラームの作成をクリック

  4. 以下の通り設定し、アラームを作成

  5. ステップ1 メトリクスと条件の指定
    以下の通り設定し、次へをクリック

    • メトリクス: すべて>EFS>ファイルシステムメトリクス
    FileSystemId メトリクス名
    <変更対象のEFSのファイルシステムID> BurstCreditBalance
    • 条件
      • 閾値の種類: 静的
      • BurstCreditBalance が次の時...: 以下
      • ... よりも: <任意の値> (私の環境では200000000000と設定しました。)
  6. ステップ2 アクションの設定
    以下の通り設定し、次へをクリック

    • 通知
      • アラーム状態トリガー: アラーム状態
      • 次の SNS トピックに通知を送信: 既存の SNS トピックを選択
      • 通知の送信先: EFS-to-provisioned
  7. ステップ3 名前と説明を追加
    以下の通り設定し、次へをクリック

    • 名前と説明
      • アラーム名: EFS BurstCreditBalance is under threshold
  8. ステップ4 プレビューと作成
    アラームの内容を確認し、問題がなければアラームの作成をクリックします。

バーストに変更するアラーム (EFS BurstCreditBalance returned to the threshold)

  1. AWSマネジメントコンソールよりCloudWatch コンソールにアクセス

  2. 左のサイドメニューよりすべてのアラームをクリック

  3. 画面右側のアラームの作成をクリック

  4. 以下の通り設定し、アラームを作成

  5. ステップ1 メトリクスと条件の指定
    以下の通り設定し、次へをクリック

    • メトリクス: すべて>EFS>ファイルシステムメトリクス
    FileSystemId メトリクス名
    <変更対象のEFSのファイルシステムID> BurstCreditBalance
    • 条件
      • 閾値の種類: 静的
      • BurstCreditBalance が次の時...: 以下
      • ... よりも: <任意の値> (私の環境では2200000000000と設定しました。)
  6. ステップ2 アクションの設定
    以下の通り設定し、次へをクリック

    • 通知
      • アラーム状態トリガー: OK
      • 次の SNS トピックに通知を送信: 既存の SNS トピックを選択
      • 通知の送信先::EFS-to-bursting
  7. ステップ3 名前と説明を追加
    以下の通り設定し、次へをクリック

    • 名前と説明
      • アラーム名: EFS BurstCreditBalance returned to the threshold
  8. ステップ4 プレビューと作成
    アラームの内容を確認し、問題がなければアラームの作成をクリックします。

AWS Lambda

Amazon EFSのスループットモードをプロビジョニング済みに変更するものと、バーストに変更するもので関数を2つ作成しました。

作成手順

プロビジョニング済みに変更する関数 (EFS-to-provisioned)

  1. AWSマネジメントコンソールよりAWS Lambda コンソールにアクセス

  2. 左のサイドメニューより関数をクリック

  3. 画面右側の関数の作成をクリック

  4. 以下の通り設定し、関数を作成

    • 関数の作成: 一から作成
    • 基本的な情報
      • 関数名: EFS-to-provisioned
      • ランタイム: Python 3.9
      • アーキテクチャ: x86_64
      • 実行ロール: 基本的な Lambda アクセス権限で新しいロールを作成
    • 詳細設定
      • VPCを有効化:
      • VPC: <変更対象のEFSと同じVPC>
      • サブネット: <変更対象のEFSと同じサブネット>
      • セキュリティグループ: <変更対象のEFSにアクセスできる設定を有したセキュリティグループ>
  5. 作成された関数の画面から設定タブを選択し、以下の通り設定を変更する

    • 一般設定
      • タイムアウト: 10 秒
    • トリガー
      • ソースを選択: SNS
      • SNS トピック: EFS-to-provisioned
  6. 作成された関数の画面からコードタブを選択し、以下のコードを貼り付け一部修正後にDeployをクリックする

# スループットモードをプロビジョニング済みに変更
import sys
import json
import boto3
import logging

# ログ設定
logger = logging.getLogger()
for h in logger.handlers:
  logger.removeHandler(h)
h = logging.StreamHandler(sys.stdout)
FORMAT = '[%(levelname)s] %(message)s'
h.setFormatter(logging.Formatter(FORMAT))
logger.addHandler(h)
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    try:
        client = boto3.client('efs')
        
        response = client.update_file_system(
            ############################ 環境に合わせて適宜変更 #############################
            FileSystemId='fs-xxxxxxxxxxxx', # 変更対象のEFSのファイルシステムID
            ThroughputMode='provisioned', # スループットモードを`プロビジョニング済み`に指定
            ProvisionedThroughputInMibps = 15.0 # プロビジョニングされたスループット (MiB/秒)
            ###############################################################################
        )
        logger.info(response)
        return True
    except:
        logger.exception('failed to lambda_handler')
        return False

バーストに変更する関数 (EFS-to-bursting)

  1. AWSマネジメントコンソールよりAWS Lambda コンソールにアクセス

  2. 左のサイドメニューより関数をクリック

  3. 画面右側の関数の作成をクリック

  4. 以下の通り設定し、関数を作成

    • 関数の作成: 一から作成
    • 基本的な情報
      • 関数名: EFS-to-bursting
      • ランタイム: Python 3.9
      • アーキテクチャ: x86_64
      • 実行ロール: 既存のロールを使用する
      • 既存のロール: <前述の手順で作成されたロールを選択>
    • 詳細設定
      • VPCを有効化:
      • VPC: <変更対象のEFSと同じVPC>
      • サブネット: <変更対象のEFSと同じサブネット>
      • セキュリティグループ: <変更対象のEFSにアクセスできる設定を有したセキュリティグループ>
  5. 作成された関数の画面から設定タブを選択し、以下の通り設定を変更する

    • 一般設定
      • タイムアウト: 10 秒
    • トリガー
      • ソースを選択: SNS
      • SNS トピック: EFS-to-bursting
  6. 作成された関数の画面からコードタブを選択し、以下のコードを貼り付け一部修正後にDeployをクリックする

# スループットモードをバーストに変更
import sys
import json
import boto3
import logging

# ログ設定
logger = logging.getLogger()
for h in logger.handlers:
  logger.removeHandler(h)
h = logging.StreamHandler(sys.stdout)
FORMAT = '[%(levelname)s] %(message)s'
h.setFormatter(logging.Formatter(FORMAT))
logger.addHandler(h)
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    try:
        client = boto3.client('efs')
        
        response = client.update_file_system(
            ############################ 環境に合わせて適宜変更 #############################
            FileSystemId='fs-xxxxxxxxxxxx', # 変更対象のEFSのファイルシステムID
            ThroughputMode='bursting', # スループットモードを`バースト`に指定
            ###############################################################################
        )
        logger.info(response)
        return True
    except:
        logger.exception('failed to lambda_handler')
        return False

IAMロール 許可ポリシー追加

Lambda関数の作成手順の中で作成されたロールにAmazon EFSの設定を変更できる権限を付与しました。
(※ 取り急ぎ動作を確認するために作成したので、必要以上の権限が付与されている可能性があります。)

追加手順

  1. AWSマネジメントコンソールよりIAM コンソールにアクセス
  2. 左のサイドメニューよりロールをクリック
  3. 前述の手順で作成されたロールを検索し、ロール名をクリック
  4. 許可を追加をクリックし、以下のポリシーにチェックを入れた後にポリシーをアタッチをクリック
    • AmazonElasticFileSystemFullAccess
    • AmazonElasticFileSystemClientFullAccess

おわりに

今回はCloudWatchAWS Lambdaを組み合わせてAWS EFSのスループットモード変更を自動化する実装について説明しました。
手動で対応していた時もそこまで時間のかかる作業ではありませんでしたが、アラームが通知される度に対応するというひと手間が解消でき、他の作業に時間を費やせるようになって良かったと思います。
この記事が同じような悩みを抱えている方の助けになれば幸いです!

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?