翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS Fargate 搭載の Amazon EKS で Amazon EFS を使用して、永続的なデータストレージでステートフルワークロードを実行する
作成者: Ricardo Morais (AWS)、Rodrigo Bersa (AWS)、Lucio Pereira (AWS)
概要
このパターンは、AWS Fargate を使用してコンピューティングリソースをプロビジョニングすることで、Amazon Elastic Kubernetes Service (Amazon EKS) で実行されているコンテナのストレージデバイスとして Amazon Elastic File System (Amazon EFS) を有効にするためのガイダンスを提供します。 EFS
このパターンで説明する設定は、セキュリティのベストプラクティスに従い、デフォルトで保管時と転送時のセキュリティを提供します。Amazon EFS ファイルシステムを暗号化するには、AWS Key Management Service (AWS KMS) キーを使用しますが、KMS キーの作成プロセスをディスパッチするキーエイリアスも指定できます。
このパターンの手順に従って、概念実証 (PoC) アプリケーションの名前空間と Fargate プロファイルを作成し、Kubernetes クラスターを Amazon EFS と統合するために使用される Amazon EFS コンテナストレージインターフェイス (CSI) ドライバーをインストールし、ストレージクラスを設定し、PoC アプリケーションをデプロイできます。これらの手順により、Fargate 上で実行中の Amazon EFS ファイルシステムが複数の Kubernetes ワークロード間で共有されます。このパターンには、これらの手順を自動化するスクリプトが付属しています。
このパターンは、コンテナ化されたアプリケーションでのデータ永続化が必要で、スケーリングオペレーション中のデータ損失を回避したい場合に使用できます。以下に例を示します。
DevOps ツール – 一般的なシナリオは、継続的インテグレーションと継続的デリバリー (CI/CD) 戦略を開発することです。この場合、Amazon EFS を共有ファイルシステムとして使用して、CI/CD ツールのさまざまなインスタンス間で設定を保存、または CI/CD ツールのさまざまなインスタンス間のパイプラインステージ用のキャッシュ (例、Apache Maven リポジトリ) を保存できます。
ウェブサーバー – 一般的なシナリオは、HTTP ウェブサーバーとして Apache を使用することです。Amazon EFS を共有ファイルシステムとして使用して、Web サーバーのさまざまなインスタンス間で共有される静的ファイルを保存できます。このシナリオ例では、静的ファイルが Docker イメージにベイクされるのではなく、変更がファイルシステムに直接適用されます。
前提条件と制限
前提条件
アクティブな AWS アカウント
Kubernetes バージョン 1.17 以降を使用する既存の Amazon EKS クラスター (バージョン 1.27 までテスト済み)
Kubernetes StorageClass をバインドし、ファイルシステムを動的にプロビジョニングする既存の Amazon EFS ファイルシステム
クラスター管理権限
目的の Amazon EKS クラスターを指すように設定されたコンテキスト
制限
Fargate で Amazon EKS を使用する際には、考慮すべき制限がいくつかあります。例えば、DaemonSets や特権コンテナなど、一部の Kubernetes コンストラクトの使用はサポートされていません。Fargate の制限の詳細については、Amazon EKS ドキュメントの「AWS Fargate に関する考慮事項」を参照してください。
このパターンで提供されるコードは、Linux または macOS を実行中のワークステーションをサポートします。
製品バージョン
AWS コマンドラインインターフェイス (AWS CLI)バージョン 2 以降
Amazon EFS CSI ドライバーバージョン 1.0 以降 (バージョン 2.4.8 までテスト済み)
eksctl バージョン 0.24.0 以降 (バージョン 0.158.0 までテスト済み)
jq バージョン 1.6 以降
kubectl バージョン 1.17 以降 (バージョン 1.27 までテスト済み)
Kubernetes バージョン 1.17 以降 (バージョン 1.27 までテスト済み)
アーキテクチャ

ターゲットアーキテクチャは、次のインフラストラクチャで構成されます。
仮想プライベートクラウド (VPC)
2 つのアベイラビリティーゾーン
インターネットアクセスを提供する NAT ゲートウェイを持つパブリックサブネット
Amazon EKS クラスターと Amazon EFS マウントターゲット (マウントポイントとも呼ばれます) を持つプライベートサブネット
VPC レベルでの Amazon EFS
Amazon EKS クラスターの環境インフラストラクチャは次のとおりです。
名前空間レベルで Kubernetes コンストラクトに対応する AWS Fargate プロファイル
以下を含む Kubernetes 名前空間:
アベイラビリティーゾーンに分散された 2 つのアプリケーションポッド
クラスターレベルで永続ボリューム (PV) にバインドされた 1 つの永続ボリュームクレーム (PVC)
名前空間内の PVC にバインドされ、クラスター外のプライベートサブネット内の Amazon EFS マウントターゲットを指すクラスター全体の PV
ツール
AWS サービス
AWS コマンドラインインターフェイス (AWS CLI) は、コマンドラインから AWS のサービスとやり取りするために使用できるオープンソースツールです。
Amazon Elastic File System (Amazon EFS) は、AWS クラウドでの共有ファイルシステムの作成と設定に役立ちます。このパターンでは、Amazon EKS で使用するシンプルで、スケーラブルな完全マネージド型の共有ファイルシステムを提供します。
Amazon Elastic Kubernetes Service (Amazon EKS) を使用すると、独自のクラスターをインストールまたは運用することなく、AWS で Kubernetes を実行できます。
AWS Fargate は、Amazon EKS 用のサーバーレスコンピューティングエンジンです。Kubernetes アプリケーションのコンピュートリソースを作成および管理します。
AWS Key Management Service (AWS KMS) は、データの保護に役立つ暗号キーを作成および管理する上で役立ちます。
その他のツール
コード
このパターンのコードは、GitHub Persistence Configuration with Amazon EFS on Amazon EKS using AWS Fargateepic06
epic01
から までのフォルダ内のエピックごとに整理されます。 エピック
ベストプラクティス
ターゲットアーキテクチャには以下のサービスとコンポーネントが含まれており、AWS Well-Architected Framework
Amazon EFS は、シンプルで、スケーラブル、伸縮性のあるフルマネージド型の NFS ファイルシステムです。これは、選択した Amazon EKS クラスターのプライベートサブネットに分散される、ポッドで実行中の PoC アプリケーションのすべてのレプリケーションの共有ファイルシステムとして使用されます。
各プライベートサブネットの Amazon EFS マウントターゲット。これにより、クラスターの仮想プライベートクラウド (VPC) 内のアベイラビリティーゾーンごとの冗長性が確保されます。
Amazon EKS は Kubernetes ワークロードを実行します。前提条件セクションで説明したように、このパターンを使用する前に Amazon EKS クラスターをプロビジョニングする必要があります。
AWS KMS は、Amazon EFS ファイルシステムに保存されているコンテンツを保存時に暗号化します。
Fargate は、コンテナのコンピュートリソースを管理するため、お客様はインフラストラクチャに負担をかけずにビジネス要件に集中できます。Fargate プロファイルはすべてのプライベートサブネットに作成されます。クラスターの仮想プライベートクラウド (VPC) 内のアベイラビリティーゾーンごとに冗長性を提供します。
Kubernetes ポッド。 アプリケーションの異なるインスタンスでコンテンツを共有、消費、および書き込むことができることを検証します。
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
Amazon EKS クラスターを作成します。 | クラスターが既にデプロイされている場合は、次のエピックに進んでください。既存の AWS アカウントに Amazon EKS クラスターを作成します。GitHub Repo ディレクトリ | AWS 管理者、Terraform または eksctl 管理者、Kubernetes 管理者 |
環境変数をエクスポートします。 | env.sh スクリプトを実行します。これにより、次のステップで必要な情報が提供されます。
まだ記載されていない場合は、次の CLI コマンドを使用して、上記で要求されたすべての情報を取得できます。
| AWS システム管理者 |
タスク | 説明 | 必要なスキル |
---|---|---|
アプリケーションワークロード用の Kubernetes 名前空間と Fargate プロファイルを作成します。 | Amazon EFS とインタラクトするアプリケーションワークロードを受信する名前空間を作成します。 カスタムアプリケーション名前空間名の場合:
カスタムアプリケーション名前空間名がない場合:
ここで、 | 権限が付与された Kubernetes ユーザー |
タスク | 説明 | 必要なスキル |
---|---|---|
一意のトークンを生成します。 | Amazon EFS では冪等オペレーションを保証する作成トークンが必要です (同じ作成トークンでオペレーションを呼び出しても効果はありません)。この要件を満たすには、使用可能な手法を使用して一意のトークンを生成する必要があります。例えば、作成トークンとして使用する汎用一意識別子 (UUID) を生成できます。 | AWS システム管理者 |
Amazon EFS ファイルシステムを作成します。 | アプリケーションワークロードによって読み書きされるデータファイルを受信するファイルシステムを作成します。暗号化されたファイルシステムまたは暗号化されていないファイルシステムを作成できます。(ベストプラクティスとして、このパターンのコードはデフォルトで保存時の暗号化を有効化する暗号化システムを作成します。) 一意の対称 AWS KMS キーを使用して、ファイルシステムを暗号化できます。カスタムキーが指定されていない場合は、AWS マネージドキーが使用されます。 Amazon EFS 用の一意のトークンを生成した後、create-efs.sh スクリプトを使用して暗号化された、または暗号化されていない Amazon EFS ファイルシステムを作成します。 KMS キーを使用しないで保存時に暗号化する場合:
ここで、 KMS キーを使用して保存時に暗号化する場合:
ここで、 暗号化しない場合:
ここで、 | AWS システム管理者 |
セキュリティグループを作成します。 | Amazon EKS クラスターが Amazon EFS ファイルシステムにアクセスできるようにするセキュリティグループを作成します。 | AWS システム管理者 |
セキュリティグループのインバウンドルールを更新します。 | セキュリティグループのインバウンドルールを更新して、以下の設定で受信トラフィックを許可します。
| AWS システム管理者 |
各プライベートサブネットのマウントターゲットを追加します。 | Kubernetes クラスターの各プライベートサブネットに、ファイルシステムとセキュリティグループのマウントターゲットを作成します。 | AWS システム管理者 |
タスク | 説明 | 必要なスキル |
---|---|---|
Amazon EFS CSI ドライバーをデプロイします。 | Amazon EFS CSI ドライバーをクラスターにデプロイします。ドライバーは、アプリケーションによって作成された永続ボリュームクレームに従ってストレージをプロビジョニングします。
このスクリプトは | 権限が付与された Kubernetes ユーザー |
ストレージクラスをデプロイします。 | Amazon EFS プロビジョナー (efs.csi.aws.com) のクラスターにストレージクラスをデプロイします。 | 権限が付与された Kubernetes ユーザー |
タスク | 説明 | 必要なスキル |
---|---|---|
永続的ボリュームをデプロイします。 | 永続ボリュームをデプロイし、作成したストレージクラスと Amazon EFS ファイルシステムの ID にリンクします。アプリケーションは永続ボリュームを使用してコンテンツの読み取りと書き込みをします。ストレージフィールドでは任意のサイズの永続ボリュームを指定できます。Kubernetes ではこのフィールドが必要ですが、Amazon EFS は伸縮性のあるファイルシステムであるため、ファイルシステムの容量は強制しません。永続ボリュームは暗号化の有無にかかわらずデプロイできます。(Amazon EFS CSI ドライバーは、ベストプラクティスとしてデフォルトで暗号化が有効化されています。) 転送時の暗号化の場合:
ここで、 転送時に暗号化しない場合:
ここで、 | 権限が付与された Kubernetes ユーザー |
アプリケーションが要求した永続ボリューム要求をデプロイします。 | アプリケーションが要求した永続ボリューム要求をデプロイし、ストレージクラスにリンクします。前に作成した永続ボリュームと同じアクセスモードを使用します。ストレージフィールドでは任意のサイズの永続ボリューム要求を指定できます。Kubernetes ではこのフィールドが必要ですが、Amazon EFS は伸縮性のあるファイルシステムであるため、ファイルシステムの容量は強制しません。 | 権限が付与された Kubernetes ユーザー |
ワークロード 1 をデプロイします。 | アプリケーションのワークロード 1 を表すポッドをデプロイします。このワークロードは、 ファイルにコンテンツを書き込みます | 権限が付与された Kubernetes ユーザー |
ワークロード 2 をデプロイします。 | アプリケーションのワークロード 2 を表すポッドをデプロイします。このワークロードは、 ファイルにコンテンツを書き込みます | 権限が付与された Kubernetes ユーザー |
タスク | 説明 | 必要なスキル |
---|---|---|
のステータスを確認します | 次のコマンドを入力して、 のステータスを確認します
出力例については、「追加情報」セクションを参照してください。 | 権限が付与された Kubernetes ユーザー |
のステータスを確認します | 次のコマンドを入力して、 のステータスを確認します
出力例については、「追加情報」セクションを参照してください。 | 権限が付与された Kubernetes ユーザー |
ワークロード 1 がファイルシステムに書き込みできることを確認します。 | 次のコマンドを入力して、ワークロード 1 が に書き込んでいることを検証します
結果は次のようになります。
| 権限が付与された Kubernetes ユーザー |
ワークロード 2 がファイルシステムに書き込みできることを確認します。 | 次のコマンドを入力して、ワークロード 2 が に書き込んでいることを検証します
結果は次のようになります。
| 権限が付与された Kubernetes ユーザー |
ワークロード 1 がワークロード 2 によって書き込まれたファイルを読み取れることを検証します。 | 次のコマンドを入力して、ワークロード 1 がワークロード 2 によって書き込まれた
結果は次のようになります。
| 権限が付与された Kubernetes ユーザー |
ワークロード 2 がワークロード 1 によって書き込まれたファイルを読み取れることを検証します。 | 次のコマンドを入力して、ワークロード 2 がワークロード 1 によって書き込まれた
結果は次のようになります。
| 権限が付与された Kubernetes ユーザー |
アプリケーションコンポーネントを削除する後もファイルが保持されることを確認します。 | 次に、スクリプトを使用してアプリケーションコンポーネント (永続ボリューム、永続ボリュームクレーム、ポッド) を削除し、ファイル
ここで、 結果は次のようになります。
| 権限が付与された Kubernetes ユーザー、システム管理者 |
タスク | 説明 | 必要なスキル |
---|---|---|
アプリケーションログを監視します。 | 2 日目のオペレーションの一環として、監視用に Amazon CloudWatch にアプリケーションログを送信します。 | AWS システム管理者、アクセス許可を付与された Kubernetes ユーザー |
Container Insights で、Amazon EKS と Kubernetes コンテナを監視します。 | 2 日目のオペレーションの一環として、Amazon CloudWatch Container Insights を使用して Amazon EKS システムと Kubernetes システムを監視します。このツールは、コンテナ化されたアプリケーションから、さまざまなレベルとディメンションでメトリクスを収集、集計、要約します。詳細については、[関連リソース] セクションを参照してください。 | AWS システム管理者、アクセス許可を付与された Kubernetes ユーザー |
CloudWatch で Amazon EFS を監視します。 | 2 日目のオペレーションの一環として、Amazon CloudWatch を使用して ファイルシステムを監視し、Amazon EFS から生データを収集し、リアルタイムに近い読み取り可能なメトリクスに処理します。詳細については、[関連リソース]セクションを参照してください。 | AWS システム管理者 |
タスク | 説明 | 必要なスキル |
---|---|---|
パターン用に作成されたすべてのリソースをクリーンアップします。 | このパターンを完了したら、AWS 料金が発生しないようにすべてのリソースをクリーンアップします。PoC アプリケーションの使用が終了したら、 KMS キーを使用して保存時に暗号化する場合:
ここで、 保存時に暗号化しない場合:
ここで、 | 権限が付与された Kubernetes ユーザー、システム管理者 |
関連リソース
リファレンス
AWS Fargate で Amazon EKS を使用するときにアプリケーションログをキャプチャする方法
(ブログ投稿) Container Insights の使用(Amazon CloudWatch ドキュメント)
Amazon EKS と Kubernetes で Container Insights をセットアップする(Amazon CloudWatch ドキュメント)
Amazon EKS と Kubernetes Container Insights のメトリクス(Amazon CloudWatch ドキュメント)
Amazon CloudWatch での Amazon EFS の監視(Amazon EFS ドキュメント)
GitHub チュートリアルおよび例
必要なツール
追加情報
コマンドの出力例を次に示しますkubectl get pv
。
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
poc-app-pv 1Mi RWX Retain Bound poc-efs-eks-fargate/poc-app-pvc efs-sc 3m56s
コマンドの出力例を次に示しますkubectl -n poc-efs-eks-fargate get pvc
。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
poc-app-pvc Bound poc-app-pv 1Mi RWX efs-sc 4m34s