翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS Fargate 搭載の Amazon EKS で Amazon EFS を使用して、永続的なデータストレージでステートフルワークロードを実行する
Ricardo Morais、Rodrigo Bersa、Lucio Pereira、Amazon Web Services
概要
このパターンは、AWS Fargate を使用してコンピュートリソースをプロビジョニングすることで、Amazon Elastic File System (Amazon EFS) で実行中のコンテナのストレージデバイスとして Amazon Elastic Kubernetes Service (Amazon EKS) を有効化するためのガイダンスを提供します。
このパターンで説明する設定は、セキュリティのベストプラクティスに従い、デフォルトで保管時と転送時のセキュリティを提供します。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 リポジトリ) を保存できます。
Web サーバー — 一般的なシナリオは、Apache を HTTP Web サーバーとして使用することです。Amazon EFS を共有ファイルシステムとして使用して、Web サーバーのさまざまなインスタンス間で共有される静的ファイルを保存できます。このシナリオ例では、静的ファイルが Docker イメージにベイクされるのではなく、変更がファイルシステムに直接適用されます。
前提条件と制限
前提条件
アクティブなAWS アカウント
バージョン 1.17 以降 (バージョン 1.27 までテスト済み) を搭載している既存の Kubernetes Amazon EKS クラスター
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) は、データの保護に効果的な暗号キーを作成および管理する上で役立ちます。
その他のツール
Code
このパターンのコードは、GitHub の「Persistence Configuration with Amazon EFS on Amazon EKS using AWS Fargateepic01 から epic06 までのフォルダにまとめられ、このパターンの「エピック」セクションの順序に対応しています。
ベストプラクティス
ターゲットアーキテクチャには、以下のサービスとコンポーネントが含まれ、AWS Well-Architected フレームワーク
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 ディレクトリ | 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 ユーザー、システム管理者 |
関連リソース
リファレンス
Amazon EKS 用 AWS Fargate が Amazon EFS をサポートするようになりました
(お知らせ) 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