Amazon Web Services ブログ
Amazon FSx でサーバレスワークロードの SMB 共有を実現する
このブログは 2021 年 11 月 2 日に Ahmed ElHaw (シニアソリューションアーキテクト) によって執筆された内容を日本語化したものです。原文はこちらを参照してください。
クラウドファースト戦略を採用する多くのお客様は、俊敏性の向上とコストの最適化のために、自動拡張、ビルトインされた高可用性、使用量に応じた課金モデルを提供するサーバーレス技術やクラウドファイルストレージを優先的に採用しています。お客様がサーバーレスアーキテクチャを採用する際、永続的なストレージ層におけるデータアクセスの共有が必要になる場合があります。AWS Lambda には、お客様のコード用に 512MB の一時ファイルシステムが含まれていますが、これは耐久性のあるストレージを意図したものではなく、一時的なリソースとなります。この記事で紹介する Lambda 関数の SMB 統合により、関数の呼び出しにまたがるデータの共有、大きな参照データファイルの読み込み、関数の出力の永続的な共有ストアへの書き込みが可能になります。
この記事では、AWS Lambda と Amazon FSx for Windows File Server を統合することに焦点を当てます。また、Amazon FSx for NetApp ONTAP を含む SMB 互換のファイルシステムならどれでも、ご紹介するソリューションを使用することができます。このソリューションでは、Amazon FSx for Windows File Server、Amazon FSx for NetApp ONTAP、オンプレミスの Windows ファイルサーバーで動作する SMB 互換のデータストア、または Amazon EC2 の Windows ファイルサーバーでホストされているファイル共有にて、ファイルやフォルダーの一覧、保存、取得、削除などのファイルおよびディレクトリ操作を実行することができます。
ユースケース
コンテンツ管理やウェブサーバー、ホームディレクトリ、ビジネスクリティカルなワークロードなどの分散型アプリケーションは、共有ファイルストレージの恩恵を受けることができます。以下に、一般的なサーバーレスのユースケースを紹介します。
- Windows のホームディレクトリや部門内での共有のような環境において、Lambda 関数を使用してユーザーのホームディレクトリや部門共有にレポートファイルを書き込むことができます。Amazon FSx for Windows File Server またはAmazon FSx for NetApp ONTAP は、ホームディレクトリ、部門共有、コンテンツ管理、高可用性 Microsoft SQL Server のデプロイなど、さまざまな用途で使用することができます。
- Amazon FSx でコンテンツをホスティングし、ファイル変更イベントに応じた自動化されたサーバーレスアクションを実行します。Amazon FSx for Windows File Server のファイルアクセス監査を使用して、ファイル変更イベントが発生するたびに Amazon CloudWatch にイベントログを生成することができます。また、このような CloudWatch Logs のエントリーが生成された時点で Lambda 関数をトリガーし、変更されたファイルに対して操作を実行することができます。 (例えば、変更されたファイルを最新の内容を反映する必要がある別のデータソースにコピーすることができます)
- 公開用 SFTP サーバーを通じて組織内でファイルを共有します。Amazon S3 に保存されたデータと AWS Transfer for SFTP を活用し、外部ファイルを SMB ファイル共有にダウンロードすることが可能です。このサーバーレス統合を通して、Lambda 関数は自動的に S3 からファイルをダウンロードし、共有ファイルシステムに保存することができます。
- Amazon Athena を使用して、Amazon S3 に保存されているデータにクエリを実行します。クエリ結果はカンマ区切り形式 (.csv) で保存され、SMB 互換のファイル共有に結果をコピーしたい場合に有効です。Lambda 関数を使用した Athena クエリのスケジューリングは一般的なユースケースであり、クエリ結果を Windows ファイル共有にコピーするよう拡張した Lambda 関数で、プロセスを自動化することができます。
ソリューションの概要
AWS Lambda はランタイムを利用することで複数の言語をサポートしています。Python、.NET、Java、Node.js など、一般的なプログラミング言語で SMB を実装したライブラリがいくつかあります。ここでは、異なるランタイムを使用した二つの Lambda 関数を紹介します。一つ目の関数は Python ランタイムを使用し、SMBv2 および SMBv3 プロトコルを実装するオープンソースの Python ライブラリである smbprotocol をインポートします。二つ目の関数 (.NET に慣れている方向け) は、SMBLibrary (オープンソースの C# SMB 1.0/CIFS, SMB 2.0, SMB 2.1, SMB 3.0 サーバとクライアントの実装) をインポートしています。
これからご紹介する Lambda 関数のコードでは、既存の Amazon FSx for Windows File Server 共有に対して二つの操作 (ファイルの保存と共有の一覧表示) を実装しています。それぞれのライブラリのドキュメントを参照することで、ニーズに合わせて操作を拡張することができます。また、AWS Secrets Manager を使ったセキュリティ面やクレデンシャル管理についても詳しく説明しています。
手順
Amazon FSx for Windows File Server、Amazon EC2 上の Windows File Server、またはオンプレミス環境で動作する SMB ファイル共有と Lambda 関数の統合を説明します。
図 1: Amazon FSx、EC2、またはオンプレミス環境で動作する SMB ファイル共有と統合する Lambda 関数
- ダミーのペイロード (“test”) を持つテストイベントを作成し、Lambda 関数を呼び出します。AWS Lambda は、他の AWS サービスと統合して関数を呼び出すことができます。.
- 注:Amazon S3 は、Lambda 関数をトリガーできるサービスの例として示されており、Lambda 関数は AWS SDK を使用して Amazon S3 から読み取りと書き込みが可能です。
- Lambda 関数が Secrets Manager からファイルサーバーの保存されたクレデンシャル (ユーザー名、パスワード、ホスト、共有名など) を取得します。
- Lambda 関数がテストファイルを作成し、ファイル共有に保存します。
AWS Serverless Application Model (SAM) を用いた手順紹介
サンプルのアプリケーションをデプロイするには、以下の前提条件が必要です。
前提条件
- リソースを作成するために必要な権限を保持している AWS クレデンシャル。この例では、管理者権限を持つクレデンシャルを使用しています。
- 利用可能な Amazon FSx ファイル共有、または有効な資格情報と VPC へのルートを持つ SMB 互換のファイル共有。Amazon FSx for Windows File Server をセットアップするには、Amazon FSx の開始方法を参照してください。Amazon FSx for NetApp ONTAP の場合はこちらのガイドをご参照ください。
- Lambda .NET core ランタイムを使用するテンプレートをデプロイする場合は、.NET SDK がインストールされていること。
- この記事の執筆時点での AWS SAM CLI のバージョン 1.29.0 です。
- GitHub のリポジトリをクローンします。
デプロイ方法
- クローンしたリポジトリのディレクトリに移動するか、
sam init
を実行して Custom Template Location を選択し、リポジトリの URL を貼り付けます。 <templateName>
を Python または .NET テンプレートに置き換え、AWS SAM アプリケーションをビルドします。
sam build -t <templateName>
3. AWS SAM アプリケーションをデプロイします。
sam deploy --guided
図 2:ガイド付き AWS SAM デプロイメントの入力値の例
AWS SAM は以下のステップを実行します。
- Secrets Manager にダミー値を格納し、シークレットを作成します。
- 選択した VPC に Secrets Manager の VPC エンドポイントを作成します。これは、VPC に接続された Lambda 関数に必要です。
- CIDR (Classless Inter-Domain Routing) ブロックの管理と参照を容易にするために、プレフィックスリストを作成します。
選択したテンプレートに応じて、AWS SAM はいずれかのアクションを実行します。
- Python ランタイムで Lambda 関数をビルドしてデプロイし、依存関係を持つライブラリの Lambda レイヤーをビルドして Lambda 関数に関連付けします。
または
- .NET Core とその依存関係で Lambda 関数をビルドします。
テスト
統合をテストするために、Python の Lambda 関数の内容を説明していきます。
1. Secrets Manager で作成したシークレットのダミー値を、ファイル共有の IP アドレスまたは解決可能なホスト名、サーバー名、ユーザー名、パスワードに置き換えます。
注:変更を加えるには、まずリソースポリシーを削除する必要があります。AWS マネジメントコンソールから、ルートユーザーとして Secrets Manager にアクセスし、リソースポリシーをメモ帳にコピーしてください。秘密鍵ペアの値を置き換えたら、再びリソースポリシーを復活させます。
注:Amazon FSx for Windows File Server の場合、シークレットのホスト値は、コンソールで見つかった「優先ファイルサーバー IP アドレス」で構成します。Amazon FSx for NetApp ONTAP の場合、シークレットのホスト値は、コンソールで見つかった「管理エンドポイント -IP アドレス」で構成します。
2. Lambda コンソールで関数を選択し、リポジトリにある json ファイル (testevent.json) からペイロードを指定してテストイベントを作成します。
図 3: Lambda 関数のテストイベント成功
3. ファイル共有にファイルが作成されることを確認します。
図 4:ファイル共有にテストファイルが作成されていることを確認
モニタリングとトラブルシューティング
ファイル共有アクセスやファイルアクセスを確認するには、Amazon FSx for Windows File Server を使用している場合、ファイルアクセス監査を有効にし、CloudWatch でログを確認することができます。Windows ファイルサーバーが EC2 やオンプレミスで稼働している場合は、Windows イベントログを確認します。
セキュリティと接続性
AWS Well-Architected Framework のセキュリティの柱に従って、すべてのレイヤーでセキュリティを確保します。すべてのレイヤー (ネットワークのエッジ、VPC、ロードバランシング、すべてのインスタンスとコンピューティングサービス、オペレーティングシステム、アプリケーション、コード) に複数のセキュリティコントロールを用い、多層的な防御アプローチを適用します。注:このソリューションは、サーバーレスワークロードの SMB アクセスを実現する方法についての概念実証です。お客様は自社のソリューションの開発時に、自社のセキュリティ要件を念頭に置く必要があります。
このソリューションでは、いくつかのセキュリティ設定が必要です。
VPC とサブネット
このデモソリューションでは、レジリエンシーのため Lambda 関数を VPC と二つのプライベートサブネットで構成しています。この設定により、Lambda 関数から AWS のプライベートリソースへの到達性の確保が可能になります。実際の環境では、ニーズに応じて Lambda 関数のサブネットから適切なルーティングを構成してください。
オンプレミスのファイルサーバーの場合、SMB トラフィックを Amazon VPC に通過させるルーティングルールを持つ Amazon VPN または AWS Direct Connect が必要です。
セキュリティグループ
このデモソリューションの Lambda 関数のセキュリティグループには、二つのアウトバウンドルールを設定し、インバウンドルールは設定しません。
- シークレットの取得のために、Secrets Manager VPC エンドポイントのセキュリティグループ (宛先) への HTTPS (ポート443) アクセスを許可するアウトバウンドルールを設定します。
- SMB トラフィックのために、ファイルサーバーの CIDR ブロック (宛先) への SMB (ポート 445) アクセスを許可するアウトバウンドルールを設定します。
注: 作成したマネージドプレフィックスリストをオンプレミスネットワークの CIDR ブロックに設定します。
図 5: Lambda 関数のセキュリティグループのアウトバウンドルール
Secrets Manager の VPC エンドポイントのセキュリティグループには、インバウンドルールが一つ設定されています。
- シークレット取得のため、Lambda 関数のセキュリティグループ (送信元) からのHTTPS (443番ポート) 通信を許可するインバウンドルールを設定します。
図 6: Secrets Manager VPC のエンドポイントセキュリティグループのルールで Lambda 関数のセキュリティグループからのインバウンド HTTPS を許可する
最後に、ファイル共有サーバーのセキュリティグループ (またはオンプレミスのファイアウォールアプライアンス) が、Lambda 関数のセキュリティグループからのインバウンドアクセス (ポート445) を許可していることを確認します。
クレデンシャルの管理
Lambda 関数は、SMB ファイル共有で認証する必要があります。クレデンシャルをハードコーディングしたり、ファイルや環境変数に保存したりすることを避けることが重要です。そのため、今回紹介するソリューションでは Lambda 関数を Secrets Manager と統合して、ファイルサーバーのクレデンシャルとパラメータを保存および取得できるようにしています。Secrets Manager は、次のスクリーンショットのように、キー・バリューのペアの形式でシークレットを保存しています。シークレットに設定する Value をカスタマイズし、Admin のクレデンシャルではなく、必要最低限の権限を持った専用のクレデンシャルを使用することをお勧めします。
図 7: Secrets Manager で認証情報とパラメータが設定されたシークレット
Secrets Manager は、アプリケーションでシークレットを取得する方法を説明するコードの例を提供しています。それらを表示するには、AWS マネジメントコンソール>AWS Secrets Manager>シークレット>シークレットの名前 にアクセスします。
転送中と格納中のデータの暗号化
Amazon FSx for Windows File Server は、ファイルシステムの暗号化において、格納中のデータの暗号化と転送中のデータの暗号化の二つの形式をサポートしています。Amazon FSx ファイルシステムを作成する際に、格納中のデータの暗号化は自動的に有効になります。転送中のデータの暗号化は、SMB プロトコル 3.0 以降をサポートするコンピューティングインスタンスにマッピングされたファイル共有でサポートされています。Amazon FSx は、お客様がアプリケーションを修正しなくとも、ファイルシステムにアクセスする際に、SMB 暗号化を使用して転送中のデータを自動的に暗号化します。
次のスクリーンショットでは、Amazon EC2 で動作する Windows ファイルサーバーと Lambda 関数のトラフィックをスニッフィングしています。Amazon FSx for Windows File Server でも同様の動作が期待できます。ファイルサーバーと Lambda 関数の間で、SMB 3.1.1 ダイアレクトにネゴシエートされたプロトコルを見ることができます。
図 8: Lambda 関数が Amazon EC2 上の Windows 2019 ファイルサーバーに送信する「Negotiate Protocol Request」
プロトコルネゴシエーションが完了すると、以下のスクリーンショットのような Lambda 関数とファイルサーバー間の暗号化されたトラフィックを確認することができます。
図 9: Lambda 関数と Amazon EC2 上の Windows 2019 ファイルサーバー間のトランジットにおける暗号化を示すパケットトレース
Amazon FSx ファイルシステム管理のベストプラクティスドキュメントに記述されているように、Amazon FSx for Windows File Server で SMB 3.x をサポートしていないクライアントに対し、転送中の暗号化を強制することによって、暗号化されていないアクセスを制限することができます。
注:この設定では、SMB 3.x をサポートしていないファイルシステムに接続されたクライアント (Lambda関数以外) はすべて接続に失敗します。
図 10: SMB 2 クライアントからの暗号化されていないアクセスを拒否する Amazon FSx for Windows File Server
IAMポリシー
Lambda 関数と Secrets Manager の VPC エンドポイントからシークレットにアクセスするために、それらのインラインポリシーを次のように設定します。
- GetSecretValue アクションは、リソースフィールドで定義されたファイルサーバーのシークレットのみに制限されます。
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal: '*'
Action:
- 'secretsmanager:GetSecretValue'
Resource: !Sub ${MySecret}
リソースポリシー
さらに、Secrets Manager に格納されているシークレットに対してリソースポリシーを設定しています。Secrets Manager に対して、定義されたソース VPC エンドポイントからのリクエストでない限り、すべてのリクエストを明示的に拒否するようにします。
注:今回の AWS SAM テンプレートでは、次のようなポリシーが作成されます。
Version: "2012-10-17"
Statement:
- Sid: EnableSecretsManagerpermissions
Effect: "Allow"
Principal:
AWS: !Sub "${AWS::AccountId}"
Action: "secretsmanager:*"
Resource: "*"
- Sid: RestrictGetSecretValueoperation
Effect: "Deny"
Principal: '*'
Action: "secretsmanager:GetSecretValue"
Resource: "*"
Condition:
StringNotEquals:
'aws:sourceVpce': !Sub '${SecretsManagerVPCEndpoint}'
リソースの削除
環境を削除するには
- CloudFormation スタックを削除するか、ターミナルから
sam delete
を実行します。
まとめ
この記事では、Python と .NET 用のオープンソースライブラリを使用して、Lambda 関数と Amazon FSx for Windows File Server または Amazon FSx for NetApp ONTAP または SMB 互換ファイル共有を統合する方法を紹介しました。このデモソリューションはサーバーレスで、AWS SAM を使って簡単にデプロイすることができます。また、ソリューションのすべてのレイヤーのセキュリティについても説明しています。この統合により、Lambda 関数は SMB 互換の永続データストアでファイル操作を実行できるようになります。
AWS Lambda を Amazon FSx ファイル共有と統合することで、関数呼び出し間でデータを共有できるようになり、Windows ホームディレクトリへのファイルの自動保存したり、ファイル変更イベント時にプログラムによるアクションを実行したり、関数呼び出しのための大規模かつ永続的なデータストアが必要なユースケースなど、Lambda を新たなユースケースで利用できます。
また、他の Lambda ランタイムや、Java や Node.js などのオープンソースの SMB ライブラリも、ご希望に応じてお試しください。すべてのソリューションの成果物は GitHub リポジトリで公開されており、必要に応じて拡張することができます。
当記事をお読みいただきありがとうございました。
翻訳はネットアップ合同会社の岩井氏、監修はソリューションアーキテクトの松本が担当しました。