

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Flux を使用して Amazon EKS マルチテナントアプリケーションのデプロイを簡素化する
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux"></a>

*Nadeem Rahaman、Aditya Ambati、Aniket Dekate、Shrikant Patil、Amazon Web Services*

## 概要
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-summary"></a>

製品やサービスを提供する多くの企業は、社内のビジネス機能間のデータバリアを維持するためにデータ規制が必要とされる業界です。このパターンでは、Amazon Elastic Kubernetes Service (Amazon EKS) のマルチテナンシー機能を使用して、単一の Amazon EKS クラスターを共有するテナントまたはユーザー間で論理的および物理的な分離を実現するデータプラットフォームを構築する方法について説明します。このパターンは、以下のアプローチを通じて分離を実現します。
+ Kubernetes 名前空間の分離
+ ロールベースのアクセスコントロール (RBAC)
+ ネットワークポリシー
+ リソースクォータ
+ AWS Identity and Access Management サービスアカウント (IRSA) の (IAM) ロール

また、このソリューションは Flux を使用して、アプリケーションをデプロイするときにテナント設定をイミュータブルに保ちます。設定に Flux `kustomization.yaml` ファイルを含むテナントリポジトリを指定することにより、テナントアプリケーションをデプロイできます。

このパターンでは、以下を実装します。
+  AWS CodeCommit Terraform スクリプトを手動でデプロイすることで作成されるリポジトリ、 AWS CodeBuild プロジェクト、 AWS CodePipeline パイプライン。
+ テナントをホストするために必要なネットワークコンポーネントとコンピューティングコンポーネント。これらは、Terraform を使用して CodePipeline と CodeBuild を介して作成されます。
+ Helm チャートで設定されるテナント名前空間、ネットワークポリシー、リソースクォータ。
+ Flux を使用してデプロイされた、異なるテナントに属するアプリケーション。

固有の要件とセキュリティ上の考慮事項に基づいて、マルチテナンシー用に独自のアーキテクチャを慎重に計画および構築することをお勧めします。このパターンは、実装の開始点となります。

## 前提条件と制限事項
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント
+ AWS Command Line Interface (AWS CLI) バージョン 2.11.4 以降、[インストール](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)および[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)済み
+ ローカルマシンにインストールされた [Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) バージョン 0.12 以降
+ [Terraform AWS Provider](https://registry.terraform.io/providers/hashicorp/aws/latest) バージョン 3.0.0 以降
+ [Kubernetes Provider](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs) バージョン 2.10 以降
+ [Helm Provider](https://registry.terraform.io/providers/hashicorp/helm/latest/docs) バージョン 2.8.0 以降
+ [Kubectl Provider](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs) バージョン 1.14 以降

**制限事項**
+ **Terraform 手動デプロイの依存関係: **CodeCommit リポジトリ、CodeBuild プロジェクト、CodePipeline パイプラインの作成を含むワークフローの初期セットアップは、Terraform の手動デプロイに依存します。インフラストラクチャの変更に手動で介入する必要があるため、自動化とスケーラビリティの面で潜在的な制限が生じます。
+ **CodeCommit リポジトリの依存関係: **ワークフローは、ソースコード管理ソリューションとして CodeCommit リポジトリに依存し、密接に結合されています AWS のサービス。

## アーキテクチャ
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-architecture"></a>

**ターゲットアーキテクチャ**

このパターンでは、次の図に示すように、3 つのモジュールをデプロイして、データプラットフォームのパイプライン、ネットワーク、コンピューティングインフラストラクチャを構築します。

*パイプラインアーキテクチャ:*

![Amazon EKS マルチテナントアーキテクチャのパイプラインインフラストラクチャ](https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/97b700a7-74b6-4f9d-b53a-76de42409a8e/images/76a4a23d-4275-427a-ae36-51c9a3803128.png)


*ネットワークアーキテクチャ:*

![Amazon EKS マルチテナントアーキテクチャのネットワークインフラストラクチャ](https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/97b700a7-74b6-4f9d-b53a-76de42409a8e/images/e542249a-19a3-4c99-b6f5-fdf80fee4edf.png)


*コンピューティングアーキテクチャ:*

![Amazon EKS マルチテナントアーキテクチャのコンピューティングインフラストラクチャ](https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/97b700a7-74b6-4f9d-b53a-76de42409a8e/images/91bd1ca8-17f0-433c-8600-4c8e6c474e31.png)


## ツール
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-tools"></a>

**AWS のサービス**
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) は完全マネージド型の構築サービスです。ソースコードのコンパイル、ユニットテストの実行、すぐにデプロイできるアーティファクトの生成を行います。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) は、独自のソースコントロールシステムを管理することなく、Git リポジトリを非公開で保存および管理できるバージョン管理サービスです。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) は、ソフトウェアリリースのさまざまな段階を迅速にモデル化および設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化するのに役立ちます。
+ [Amazon Elastic Kubernetes Service (Amazon EKS) ](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)を使用すると、独自の Kubernetes コントロールプレーンやノードをインストールまたは維持 AWS することなく、 で Kubernetes を実行できます。
+ [AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html) は、仮想プライベートクラウド (VPC) とオンプレミスネットワークを接続する中央ハブです。
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) は、定義した仮想ネットワークに AWS リソースを起動するのに役立ちます。この仮想ネットワークは、ユーザー自身のデータセンターで運用されていた従来のネットワークと似ていますが、 AWSのスケーラブルなインフラストラクチャを使用できるという利点があります。

**その他のツール**
+ [Cilium ネットワークポリシー](https://cilium.io/use-cases/network-policy/#:~:text=Cilium%20implements%20Kubernetes%20Network%20Policies,%2C%20Kafka%2C%20gRPC%2C%20etc.)は、Kubernetes L3 および L4 ネットワークポリシーをサポートします。L7 ポリシーで拡張して、HTTP、Kafka、gRPC、その他の同様のプロトコルに API レベルのセキュリティを提供できます。
+ [Flux](https://fluxcd.io/) は、Git ベースの継続的デリバリー (CD) ツールです。Kubernetes へのアプリケーションのデプロイを自動化します。
+ [Helm](https://helm.sh/docs/) は、Kubernetes 用のオープンソースのパッケージマネージャです。Kubernetes クラスター上でアプリケーションをインストールおよび管理できます。
+ 「[Terraform](https://www.terraform.io/)」は、HashiCorp の infrastructure as code (IaC) ツールで、クラウドとオンプレミスのリソースの作成と管理を支援します。

**コードリポジトリ**

このパターンのコードは、GitHub「[EKS Multi-Tenancy Terraform Solution](https://github.com/aws-samples/aws-eks-multitenancy-deployment)」のリポジトリで入手できます。

## ベストプラクティス
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-best-practices"></a>

この実装を使用するためのガイドラインとベストプラクティスについては、以下を参照してください。
+ [Amazon EKS マルチテナンシーのベストプラクティス](https://aws.github.io/aws-eks-best-practices/security/docs/multitenancy/)
+ [Flux ドキュメント](https://fluxcd.io/flux/get-started/)

## エピック
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-epics"></a>

### Terraform のビルド、テスト、デプロイの各ステージのパイプラインを作成する
<a name="create-pipelines-for-terraform-build-test-and-deploy-stages"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| プロジェクトリポジトリのクローンを作成する | ターミナルウィンドウで次のコマンドを実行して、GitHub [EKS Multi-Tenancy Terraform Solution](https://github.com/aws-samples/aws-eks-multitenancy-deployment) のリポジトリをクローンします。<pre>git clone https://github.com/aws-samples/aws-eks-multitenancy-deployment.git</pre> | AWS DevOps | 
| Terraform S3 バケットと Amazon DynamoDB をブートストラップします。 | 1. `bootstrap` フォルダで `bootstrap.sh` ファイルを開き、S3 バケット名、DynamoDB テーブル名、 AWS リージョンの変数値を更新します。<pre>S3_BUCKET_NAME="<S3_BUCKET_NAME>" <br />DYNAMODB_TABLE_NAME="<DYNAMODB_NAME>" <br />REGION="<AWS_REGION>"</pre><br />2. `bootstrap.sh` スクリプトを実行します。スクリプトには AWS CLI、[前提条件](#simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-prereqs)の一部としてインストールした が必要です。<pre>cd bootstrap<br />./bootstrap.sh</pre> | AWS DevOps | 
| `run.sh` および `locals.tf` ファイルを更新します。 | 1. ブートストラッププロセスが正常に完了したら、`bootstrap.sh` スクリプトの `variables` セクションから S3 バケットと DynamoDB テーブル名をコピーします。<pre># Variables<br />S3_BUCKET_NAME="<S3_BUCKET_NAME>"<br />DYNAMODB_TABLE_NAME="<DYNAMODB_NAME"</pre><br />2. これらの値をプロジェクトのルートディレクトリにある `run.sh` スクリプトに貼り付けます。<pre>BACKEND_BUCKET_ID="<SAME_NAME_AS_S3_BUCKET_NAME>"<br />DYNAMODB_ID="<SAME_NAME_AS_DYNAMODB_NAME>"</pre><br />3. プロジェクトコードを CodeCommit リポジトリにアップロードします。`demo/pipeline/locals.tf` ファイルの次の変数を `true` に設定することにより、Terraform からこのリポジトリを自動的に作成できます。<pre>create_new_repo = true</pre><br />4. 要件に従って `locals.tf` ファイルを更新し、パイプラインリソースを作成します。 | AWS DevOps | 
| パイプラインモジュールをデプロイします。 | パイプラインリソースを作成するには、次の Terraform コマンドを手動で実行します。これらのコマンドを自動的に実行するためのオーケストレーションはありません。<pre>./run.sh -m pipeline -e demo -r <AWS_REGION> -t init<br />./run.sh -m pipeline -e demo -r <AWS_REGION> -t plan<br />./run.sh -m pipeline -e demo -r <AWS_REGION> -t apply</pre> | AWS DevOps | 

### ネットワークインフラストラクチャを作成する
<a name="create-the-network-infrastructure"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| パイプラインを開始します。 | 1. `templates` フォルダで、`buildspec` ファイルの次の変数が `network` に設定されていることを確認します。<pre>TF_MODULE_TO_BUILD: "network"</pre><br />2. [CodePipeline コンソール](https://console.aws.amazon.com/codesuite/codepipeline/home)のパイプラインの詳細ページで、**[変更のリリース]** を選択してパイプラインを開始します。初めて実行した後は、CodeCommit リポジトリのメインブランチに変更をコミットするたびに、パイプラインが自動的に開始されます。<br />パイプラインには次の[ステージ](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts.html#concepts-stages)が含まれます。+ `validate` は Terraform を初期化し、[checkov](https://www.checkov.io/) ツールと [tfsec](https://github.com/aquasecurity/tfsec) ツールを使用して Terraform セキュリティスキャンを実行し、スキャンレポートを S3 バケットにアップロードします。<br />+ `plan ` は Terraform プランを表示し、そのプランを S3 バケットにアップロードします。<br />+ `apply` は S3 バケットから Terraform プラン出力を適用し、 AWS リソースを作成します。<br />+ `destroy` は、`apply`ステージ中に作成された AWS リソースを削除します。このオプションのステージを有効にするには、`demo/pipeline/locals.tf` ファイルで次の変数を `true` に設定します。<pre>enable_destroy_stage = true</pre> | AWS DevOps | 
| ネットワークモジュールを通じて作成されたリソースを検証します。 | パイプラインが正常にデプロイされた後に、次の AWS リソースが作成されていることを確認します。+ 3 つのパブリックサブネットと 3 つのプライベートサブネット、インターネットゲートウェイ、NAT ゲートウェイを備えた Egress VPC。<br />+ 3 つのプライベートサブネットを持つ Amazon EKS VPC。<br />+ それぞれ 3 つのプライベートサブネットを持つテナント 1 とテナント 2 VPC。<br />+ すべての VPC アタッチメントと各プライベートサブネットへのルートを持つトランジットゲートウェイ。<br />+ 送信先 CIDR ブロックが `0.0.0.0/0` の Amazon EKS Egress VPC の静的トランジットゲートウェイルート。これは、すべての VPC が Amazon EKS Egress VPC を介してアウトバウンドインターネットアクセスできるようにするために必要です。 | AWS DevOps | 

### コンピューティングインフラストラクチャを作成する
<a name="create-the-compute-infrastructure"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| `locals.tf` を更新して、CodeBuild プロジェクトの VPC へのアクセスを有効にします。 | Amazon EKS プライベートクラスターのアドオンをデプロイするには、CodeBuild プロジェクトを Amazon EKS VPC にアタッチする必要があります。1. `demo/pipeline` フォルダで `locals.tf` ファイルを開き、`vpc_enabled` 変数を `true` に設定します。<br />2. `run.sh` スクリプトを実行して、パイプラインモジュールに変更を適用します。<pre>demo/pipeline/locals.tf<br />./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd init<br />./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd plan <br />./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd apply</pre> | AWS DevOps | 
| `buildspec` ファイルを更新してコンピューティングモジュールを構築します。 | `templates` フォルダのすべての `buildspec` YAML ファイルで、`TF_MODULE_TO_BUILD` 変数の値を `network` から `compute` に設定します。<pre>TF_MODULE_TO_BUILD: "compute"</pre> | AWS DevOps | 
| テナント管理 Helm チャートの `values` ファイルを更新します。 | 1. 次の場所で `values.yaml` ファイルを開きます。<pre>cd cfg-terraform/demo/compute/cfg-tenant-mgmt</pre><br />ファイルは次のようになります。<pre>---<br />global:<br />  clusterRoles:<br />    operator: platform-tenant<br />    flux: flux-tenant-applier<br />  flux:<br />    tenantCloneBaseUrl: ${TEANT_BASE_URL}<br />    repoSecret: ${TENANT_REPO_SECRET}<br />tenants:<br />  tenant-1:<br />    quotas:<br />      limits:<br />        cpu: 1<br />        memory: 1Gi<br />    flux:<br />      path: overlays/tenant-1<br />  tenant-2:<br />    quotas:<br />      limits:<br />        cpu: 1<br />        memory: 2Gi<br />    flux:<br />      path: overlays/tenant-2</pre><br />2. `global` および `tenants` セクションで、要件に基づいて設定を更新します。`tenantCloneBaseUrl` – すべてのテナントのコードをホストするリポジトリへのパス (すべてのテナントに同じ Git リポジトリを使用します)`repoSecret` – グローバルテナント Git リポジトリに対して認証するための SSH キーと既知のホストを保持する Kubernetes シークレット`quotas` – テナントごとに適用する Kubernetes リソースクォータ`flux path` – グローバルテナントリポジトリ内のテナントアプリケーション YAML ファイルへのパス | AWS DevOps | 
| コンピューティングリソースを検証します。 | 前のステップでファイルを更新すると、CodePipeline が自動的に起動します。コンピューティングインフラストラクチャ用に次の AWS リソースが作成されていることを確認します。+ プライベートエンドポイントを持つ Amazon EKS クラスター<br />+ Amazon EKS ワーカーノード<br />+ Amazon EKS アドオン: 外部シークレット、`aws-loadbalancer-controller`、`metrics-server`<br />+ GitOps モジュール、Flux Helm チャート、Cilium Helm チャート、テナント管理 Helm チャート | AWS DevOps | 

### テナント管理およびその他のリソースを確認する
<a name="check-tenant-management-and-other-resources"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Kubernetes のテナント管理リソースを検証します。 | 次のコマンドを実行し、Helm を使用してテナント管理リソースが正常に作成されたことを確認します。1. `values.yaml` で指定されているとおり、テナント名前空間が作成されました。<pre>kubectl get ns -A</pre><br />2. クォータは、`values.yaml` で指定されているとおり、各テナント名前空間に割り当てられます。<pre>kubectl get quota --namespace=<tenant_namespace></pre><br />3. 各テナント名前空間のクォータの詳細は正確です。<pre>kubectl describe quota cpu-memory-resource-quota-limit -n <tenant_namespace></pre><br />4. Cilium ネットワークポリシーが各テナント名前空間に適用されました。<pre>kubectl get CiliumNetworkPolicy -A</pre> | AWS DevOps | 
| テナントアプリケーションのデプロイを確認します。 | 次のコマンドを実行して、テナントアプリケーションがデプロイされたことを確認します。1. Flux は、GitOps モジュールで指定された CodeCommit リポジトリに接続できます。<pre>kubectl get gitrepositories -A</pre><br />2. Flux kustomization Controller は、CodeCommit リポジトリに YAML ファイルをデプロイしました。<pre>kubectl get kustomizations -A</pre><br />3. すべてのアプリケーションリソースはテナント名前空間にデプロイされます。<pre>kubectl get all -n <tenant_namespace></pre><br />4. イングレスはテナントごとに作成されています。<pre>kubectl get ingress -n <tenant_namespace></pre> |  | 

## トラブルシューティング
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| 次のようなエラーメッセージが表示されます。<br />`Failed to checkout and determine revision: unable to clone unknown error: You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit.` | 問題のトラブルシューティングを行うには、以下の手順を実行します。1. テナントアプリケーションリポジトリを確認する: リポジトリが空であるか、設定が間違っていると、エラーが発生する可能性があります。テナントアプリケーションリポジトリに必要なコードが含まれていることを確認してください。<br />2. `tenant_mgmt` モジュールを再デプロイする: `tenant_mgmt` モジュール設定ファイルで、`app` ブロックを見つけ、`deploy` パラメータを `0` に設定します。<pre>deploy = 0</pre><br />Terraform `apply` コマンドを実行したら、`deploy` パラメータ値を `1` に戻します。<pre>deploy = 1</pre><br />3. ステータスを再確認する: 前のステップを実行した後、次のコマンドを使用して問題が解決したかどうかを確認します。<pre> kubectl get gitrepositories -A</pre><br />問題が解決しない場合は、Flux ログの詳細を確認するか、[Flux の一般的なトラブルシューティングガイド](https://fluxcd.io/flux/cheatsheets/troubleshooting/)を参照してください。 | 

## 関連リソース
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-resources"></a>
+ [Amazon EKS Blueprints for Terraform](https://github.com/aws-ia/terraform-aws-eks-blueprints)
+ [Amazon EKS ベストプラクティスガイド、マルチテナンシーセクション](https://aws.github.io/aws-eks-best-practices/security/docs/multitenancy/)
+ [Flux ウェブサイト](https://fluxcd.io/)
+ [Helm ウェブサイト](https://helm.sh/)

## 追加情報
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-additional"></a>

テナントアプリケーションをデプロイするためのリポジトリ構造の例を次に示します。

```
applications
sample_tenant_app
├── README.md
├── base
│   ├── configmap.yaml
│   ├── deployment.yaml
│   ├── ingress.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── tenant-1
    │   ├── configmap.yaml
    │   ├── deployment.yaml
    │   └── kustomization.yaml
    └── tenant-2
        ├── configmap.yaml
        └── kustomization.yaml
```