

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# EKS 機能
<a name="capabilities"></a>

**ヒント**  
使用開始: [ACK 機能の作成](create-ack-capability.md) \$1 [Argo CD 機能の作成](create-argocd-capability.md) \$1 [kro 機能の作成](create-kro-capability.md) 

Amazon EKS 機能は、開発者のベロシティを加速させ、Kubernetes での構築とスケールの複雑さを軽減するのに役立つ、完全マネージド型のクラスター機能のレイヤーセットです。EKS 機能は、宣言型の継続的デプロイ、AWS リソース管理、Kubernetes リソースの作成とオーケストレーションに対応した Kubernetes ネイティブの機能であり、いずれも AWS で完全に管理されます。EKS 機能を使用すると、基盤となるプラットフォームサービスのオペレーションにかかる負担を AWS にオフロードして、ワークロードの構築とスケールに集中できます。これらの機能はクラスター内ではなく EKS 内で実行されるため、重要なプラットフォームコンポーネントをワーカーノードにインストール、メンテナンス、スケールする必要がありません。

使用を開始するには、新規または既存の EKS クラスターに 1 つ以上の EKS 機能を作成します。そのためには、AWS CLI、AWS マネジメントコンソール、EKS API、eksctl、または任意の Infrastructure as Code ツールを使用します。EKS 機能は、互いに連携するように設計されていると共に、ユースケースと要件に基づいて選択可能な独立したクラウドリソースです。

EKS でサポートされている Kubernetes バージョンは、いずれも EKS 機能でサポートされています。

**注記**  
EKS 機能は、Amazon EKS が利用可能なすべての AWS 商用リージョンで利用できます。サポートされているリージョンの一覧については、「AWS 全般的なリファレンス」の「[Amazon EKS エンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/eks.html)」を参照してください。

## 利用可能な機能
<a name="_available_capabilities"></a>

### AWS Controllers for Kubernetes (ACK)
<a name="shared_aws_controllers_for_kubernetes_ack"></a>

ACK を使用すると、Kubernetes API を使用して AWS リソースを管理できるため、Kubernetes カスタムリソースを使用して S3 バケット、RDS データベース、IAM ロールなどの AWS リソースを作成および管理できます。ACK は、目的の状態と AWS での実際の状態とを継続的に調整して、時間の経過に伴うドリフトを修正します。これにより、システムの正常性を維持し、リソースを指定どおりに設定できます。Kubernetes ワークロードと共に、同じツールとワークフローを使用して AWSリソースも管理でき、S3、RDS、DynamoDB、Lambda など 50 を超える AWS サービスをサポートしています。ACK は、クロスアカウントおよびクロスリージョンのリソース管理をサポートし、マルチアカウントでマルチクラスターの複雑なシステム管理アーキテクチャを実現します。また、読み取り専用リソースと読み取り専用採用をサポートしているため、他の Infrastructure as Code ツールから Kubernetes ベースのシステムに容易に移行できます。

 [ACK の詳細はこちら →](ack.md) 

### Argo CD
<a name="_argo_cd"></a>

Argo CD は、アプリケーションを GitOps ベースで継続的にデプロイする仕組みを実装しており、Git リポジトリをワークロードとシステム状態の信頼できるソースとして使用します。また、アプリケーションリソースを Git リポジトリからクラスターに自動的に同期し、ドリフトを検出および修正して、デプロイしたアプリケーションが目的の状態と一致するようにします。1 つの Argo CD インスタンスから複数のクラスターにわたってアプリケーションをデプロイおよび管理でき、変更がコミットされるたびに Git リポジトリから自動的にデプロイされます。Argo CD と ACK を一緒に使用すると、基盤となる GitOps システムを実現して、ワークロードの依存関係管理をシンプルにし、クラスターやインフラストラクチャを規模に応じて管理するなどシステム全体の設計をサポートできます。Argo CD は、AWS アイデンティティセンターとの統合により認証と認可を実施し、Argo UI のホストによりアプリケーションのヘルスとデプロイのステータスを可視化します。

 [Argo CD の詳細はこちら →](argocd.md) 

### kro (Kube Resource Orchestrator)
<a name="_kro_kube_resource_orchestrator"></a>

kro でカスタムの Kubernetes API を作成することにより、複数のリソースを高次の抽象化に構成できるため、プラットフォームチームはよく使用されるリソースを組み合わせてクラウド構成要素を構築できるように再利用可能なパターンを定義できます。kro では、Kubernetes リソースと AWS リソースの両方を統合抽象化に構成し、シンプルな構文を使用して、動的設定と条件付きロジックを有効にできます。kro を使用すると、プラットフォームチームが適切なガードレールに沿ってセルフサービス機能を提供できるため、開発者は組織の標準とベストプラクティスを維持しながら、シンプルな目的別 API を使用して複雑なインフラストラクチャをプロビジョニングできます。kro リソースは Kubernetes リソースにすぎず、Kubernetes マニフェストに指定して Git に保存できます。あるいは、Amazon ECR などの OCI 互換のレジストリにプッシュして、組織内に広範に分散させることもできます。

 [kro の詳細はこちら →](kro.md) 

## EKS 機能のメリット
<a name="_benefits_of_eks_capabilities"></a>

EKS 機能は、AWS で完全に管理されるため、基礎となるクラスターサービスのインストール、メンテナンス、スケールが不要です。AWS がセキュリティパッチ適用、更新、オペレーション管理を担うため、チームはクラスターオペレーションではなく AWS での構築に集中できます。クラスターリソースを消費する従来の Kubernetes アドオンとは異なり、機能はワーカーノードではなく EKS で動作します。これにより、クラスター内コントローラーやその他のプラットフォームコンポーネントの管理に伴うオペレーションの負担を最小限に抑えながら、ワークロードのクラスターのキャパシティとリソースを解放できます。

EKS 機能により、`kubectl` などネイティブの Kubernetes API とツールを使用して、デプロイ、AWS リソース、カスタム Kubernetes リソース、およびコンポジションを管理できます。すべての機能がクラスターのコンテキストで動作し、アプリケーションリソースとクラウドインフラストラクチャリソースの両方で設定のドリフトを自動的に検出して修正します。1 つのコントロールポイントから複数のクラスター、AWS アカウント、およびリージョンにリソースをデプロイして管理できるため、複雑な分散環境でのオペレーションがシンプルになります。

EKS 機能は、GitOps ワークフロー用に設計されており、インフラストラクチャとアプリケーションのバージョンを宣言型で管理できます。変更が Git からシステムを通じて流れていくため、監査証跡、ロールバック機能、およびコラボレーションワークフローを既存の開発プラクティスと統合できます。この Kubernetes ネイティブアプローチにより、複数のツールを使用したり、クラスターの外部にある Infrastructure as Code システムを管理したりする必要がなく、信頼できる単一のソースを参照すればよくなります。バージョン管理された Kubernetes 宣言型設定に定義された目的の状態は、環境全体に継続的に適用されます。

## 料金
<a name="_pricing"></a>

EKS 機能に前払いのコミットメントや料金はありません。機能リソースごとに Amazon EKS クラスターでアクティブになっている時間単位で課金されます。EKS 機能で管理される特定の Kubernetes リソースも、時間単位で課金されます。

現在の料金については、「[Amazon EKS の料金ページ](https://aws.amazon.com/eks/pricing/)」を参照してください。

**ヒント**  
AWS Cost Explorer と、コストと使用状況レポートとを使用すると、機能のコストを他の EKS 料金とは別に追跡できます。機能にコスト配分の目的でクラスター名、機能タイプ、その他の詳細のタグを付与できます。

## EKS 機能の仕組み
<a name="_how_eks_capabilities_work"></a>

各機能は、EKS クラスターに作成する AWS リソースです。作成した機能は、EKS で実行され、AWS で完全に管理されます。

**注記**  
1 つのクラスターのタイプ (Argo CD、ACK、kro) ごとに機能リソースを 1 つ作成できます。同じクラスターで同じタイプに機能リソースを複数作成することはできません。

クラスターの機能とのインタラクションには、標準の Kubernetes API とツールを使用します。
+ `kubectl` を使用して Kubernetes カスタムリソースを適用します。
+ GitOps ワークフローの信頼できるソースとして Git リポジトリを使用します。

追加のツールがサポートされている機能もあります。例えば、次のようになります。
+ Argo CD CLI を使用して、Argo CD 機能のリポジトリおよびクラスターを設定および管理します。
+ Argo CD UI を使用して、Argo CD 機能で管理されるアプリケーションを可視化および管理します。

各機能は、互いに連携するように設計されていますが、いずれも独立しており、完全にオプトインされています。必要に応じて 1 つ、2 つ、または 3 つすべての機能を有効にし、要件の進化に伴って設定を更新できます。

EKS コンピューティングのいずれのタイプも、EKS 機能で使用できるようにサポートされています。詳細については、「[ノードを使用してコンピューティングリソースを管理する](eks-compute.md)」を参照してください。

IAM ロールでのセキュリティ設定と詳細については、「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。マルチクラスターアーキテクチャパターンについては、「[EKS 機能と考慮事項](capabilities-considerations.md)」を参照してください。

## 一般的なユースケース
<a name="_common_use_cases"></a>

 **アプリケーションとインフラストラクチャの GitOps** 

Argo CD を使用してアプリケーションとオペレーションコンポーネントをデプロイし、ACK を使用してクラスター設定の管理とインフラストラクチャのプロビジョニングを行います。どちらも、Git リポジトリから実施します。アプリケーション、データベース、ストレージ、ネットワークといったスタック全体がコードとして定義され、自動的にデプロイされます。

例: 開発チームが Git に変更をプッシュします。Argo CD が更新後のアプリケーションをデプロイし、ACK が新規 RDS データベースを適切な設定でプロビジョニングします。すべての変更が監査可能で、可逆性があり、環境間で一貫性が保たれます。

 **セルフサービスによるプラットフォームエンジニアリング** 

kro でカスタム API を作成して、ACK リソースと Kubernetes リソースを構成できます。プラットフォームチームは、ガードレールに沿って承認済みのパターンを定義します。アプリケーションチームは、シンプルで高レベルの API を使用して、完全なスタックをプロビジョニングします。

例: プラットフォームチームは、「WebApplication」という API を作成して、デプロイ、サービス、イングレス、S3 バケットをプロビジョニングします。開発者は、この API を使用するにあたって、その基盤となる複雑さや AWS アクセス許可について知る必要がありません。

 **マルチクラスターアプリケーション管理** 

Argo CD を使用して、リージョンやアカウントが異なる複数の EKS クラスターにアプリケーションをデプロイします。一貫したポリシーとワークフローに従って、単一の Argo CD インスタンスからすべてのデプロイを管理します。

例: 複数のリージョンにまたがる開発、ステージング、本番稼働用のクラスターに同じアプリケーションをデプロイします。Argo CD により、各環境はその対応する Git ブランチと常に同期するようになります。

 **マルチクラスター管理** 

ACK を使用して EKS クラスターを定義およびプロビジョニングし、kro を使用して組織の標準に従ってクラスター設定をカスタマイズし、Argo CD を使用してクラスターのライフサイクルと設定を管理します。これにより、作成から継続的な運用までエンドツーエンドでクラスターを管理できます。

例: ACK と kro により、クラスターインフラストラクチャをプロビジョニングおよび管理するように EKS クラスターを定義して、ネットワーク、セキュリティポリシー、アドオンなどの設定に関して組織全体の標準を定義します。Argo CD を使用すると、一貫した標準と自動ライフサイクル管理を利用してフリート全体でクラスター、設定、Kubernetes バージョン更新を作成し、継続的に管理します。

 **移行とモダナイズ** 

ネイティブのクラウドリソースプロビジョニングと GitOps ワークフローに従って、EKS への移行をシンプルにします。ACK を使用して既存の AWS リソースを再作成することなく採用し、Argo CD を使用して Git からワークロードのデプロイを運用できるようにします。

例: EC2 から EKS に移行するチームは、まず ACK を使用して既存の RDS データベースと S3 バケットを採用し、次に Argo CD を使用して Git からコンテナ化されたアプリケーションをデプロイします。移行パスは明確で、オペレーションは最初から標準化されます。

 **アカウントとリージョンのブートストラッピング** 

Argo CD と ACK を一緒に使用して、アカウントとリージョン全体にわたるインフラストラクチャのロールアウトを自動化します。Git に Infrastructure as Code を定義し、機能がデプロイと管理を担えるようにします。

例: プラットフォームチームは、VPC、IAM ロール、RDS インスタンス、モニタリングスタックといった標準アカウント設定を定義している Git リポジトリを維持します。Argo CD がこれらの設定を新しいアカウントとリージョンに自動的にデプロイするため、一貫性が確保され、手動セットアップ時間が数日から数分に短縮されます。

# 機能リソースの使用
<a name="working-with-capabilities"></a>

このトピックでは、すべての機能タイプで機能リソースを管理するための一般的なオペレーションについて説明します。

## EKS 機能リソース
<a name="_eks_capability_resources"></a>

EKS 機能は、Amazon EKS クラスターでマネージド機能を有効にする AWS リソースです。機能は EKS で実行されるため、コントローラーやその他の運用コンポーネントをワーカーノードにインストールして維持する必要がありません。機能は、特定の EKS クラスター用に作成され、ライフサイクル全体でそのクラスターと関連付けられます。

各機能リソースには、次のものがあります。
+ クラスター内で一意の名前
+ 機能タイプ (ACK、ARGOCD、または KRO)
+ 名前とタイプの両方を指定する Amazon リソースネーム (ARN)
+ 機能 IAM ロール
+ 現在の状態を示すステータス
+ 汎用の設定と機能タイプ固有の設定

## 機能ステータスについて
<a name="_understanding_capability_status"></a>

機能リソースには、現在の状態を示すステータスがあります。機能のステータスとヘルスは、EKS コンソールまたは AWS CLI を使用して表示できます。

 **コンソール:**

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択します。

1. **[機能]** タブを選択すると、すべての機能のステータスが表示されます。

1. 詳細なヘルス情報については、**[オブザーバビリティ]** タブを選択し、**[クラスターをモニタリング]** を選択してから、**[機能]** タブを選択します。

 **AWS CLI**:

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-capability-name
```

### 機能ステータス
<a name="_capability_statuses"></a>

 **CREATING**: 機能のセットアップ中です。コンソールから移動できます。この機能はバックグラウンドで引き続き作成されます。

 **ACTIVE**: 機能の実行中ですぐに使用できるようになります。リソースが想定どおりに動作しない場合は、リソースのステータスと IAM アクセス許可を確認してください。ガイダンスについては、「[EKS 機能をトラブルシューティングする](capabilities-troubleshooting.md)」を参照してください。

 **UPDATING**: 設定変更の適用中です。ステータスが `ACTIVE` に戻るまで待ちます。

 **DELETING**: クラスターから機能を削除中です。

 **CREATE\$1FAILED**: セットアップでエラーが発生しました。一般的な原因には、以下が含まれます。
+ IAM ロールの信頼ポリシーが正しくないか、見つかりません。
+ IAM ロールが存在しないか、アクセスできません。
+ クラスターアクセスに問題があります。
+ 設定パラメータが無効です。

特定のエラーの詳細については、機能ヘルスセクションを確認してください。

 **UPDATE\$1FAILED**: 設定の更新に失敗しました。機能ヘルスセクションで詳細を確認し、IAM アクセス許可を検証します。

**ヒント**  
トラブルシューティングの詳細なガイダンスについては、以下を参照してください。  
 [EKS 機能をトラブルシューティングする](capabilities-troubleshooting.md) - 一般的な機能のトラブルシューティング
 [ACK 機能に関する問題をトラブルシューティングする](ack-troubleshooting.md) - ACK 固有の問題
 [Argo CD 機能に関する問題をトラブルシューティングする](argocd-troubleshooting.md) - Argo CD 固有の問題
 [kro 機能に関する問題をトラブルシューティングする](kro-troubleshooting.md) - kro 固有の問題

## 機能を作成する
<a name="_create_capabilities"></a>

クラスターに機能を作成するには、以下のトピックを参照してください。
+  [ACK 機能を作成する](create-ack-capability.md) – Kubernetes API を使用して AWS リソースを管理するための ACK 機能を作成する
+  [Argo CD 機能を作成する](create-argocd-capability.md) – GitOps による継続的デリバリーのための Argo CD 機能を作成する
+  [kro 機能の作成](create-kro-capability.md) – リソースの構成とオーケストレーションのための kro 機能を作成する

## 機能を一覧表示する
<a name="_list_capabilities"></a>

クラスター上のすべての機能リソースを一覧表示できます。

### コンソール
<a name="_console"></a>

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択して、クラスターの詳細ページを開きます。

1. **[機能]** タブを選択します。

1. **[マネージド機能]** で機能リソースを表示します。

### AWS CLI
<a name="shared_aws_cli"></a>

`list-capabilities` コマンドを使用して、クラスター上のすべての機能を表示します。*region-code* はクラスターがある AWS リージョンに、*my-cluster* はクラスターの名前に置き換えます。

```
aws eks list-capabilities \
  --region region-code \
  --cluster-name my-cluster
```

```
{
    "capabilities": [
        {
            "capabilityName": "my-ack",
            "arn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/ack/my-ack/abc123",
            "type": "ACK",
            "status": "ACTIVE",
            "createdAt": "2025-11-02T10:30:00.000000-07:00",
            "modifiedAt": "2025-11-02T10:32:15.000000-07:00",
        },
        {
            "capabilityName": "my-kro",
            "arn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/kro/my-kro/abc123",
            "type": "KRO",
            "status": "ACTIVE",
            "version": "v0.6.3",
            "createdAt": "2025-11-02T10:30:00.000000-07:00",
            "modifiedAt": "2025-11-02T10:32:15.000000-07:00",
        },
        {
            "capabilityName": "my-argocd",
            "arn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/argocd/my-argocd/abc123",
            "type": "ARGOCD",
            "status": "ACTIVE",
            "version": "3.1.8-eks-1",
            "createdAt": "2025-11-21T08:22:28.486000-05:00",
            "modifiedAt": "2025-11-21T08:22:28.486000-05:00"
        }
    ]
}
```

## 機能の説明
<a name="_describe_a_capability"></a>

設定やステータスなど、特定の機能に関する詳細情報を取得します。

### コンソール
<a name="_console_2"></a>

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択して、クラスターの詳細ページを開きます。

1. **[機能]** タブを選択します。

1. **[マネージド機能]** から表示する機能を選択します。

1. ステータス、設定、作成時刻など、機能の詳細を表示します。

### AWS CLI
<a name="shared_aws_cli"></a>

`describe-capability` コマンドを使用して、詳細情報を表示します。*region-code* をクラスターがある AWS リージョンに、*my-cluster* をクラスターの名前に、*capacity-name* を機能名 (ack、argocd、または kro) に置き換えます。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name capability-name
```

 **出力例:** 

```
{
  "capability": {
    "capabilityName": "my-ack",
    "capabilityArn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/ack/my-ack/abc123",
    "clusterName": "my-cluster",
    "type": "ACK",
    "roleArn": "arn:aws:iam::111122223333:role/AmazonEKSCapabilityACKRole",
    "status": "ACTIVE",
    "configuration": {},
    "tags": {},
    "health": {
      "issues": []
    },
    "createdAt": "2025-11-19T17:11:30.242000-05:00",
    "modifiedAt": "2025-11-19T17:11:30.242000-05:00",
    "deletePropagationPolicy": "RETAIN"
  }
}
```

## 機能の設定を更新する
<a name="_update_the_configuration_of_a_capability"></a>

機能の設定の一部は、作成後に更新できます。使用できる設定オプションは、機能タイプによって異なります。

**注記**  
EKS 機能リソースは、パッチ適用やバージョン更新を含め、完全に管理されています。機能を更新すると、リソースの設定が更新されますが、マネージド機能コンポーネントのバージョンは更新されません。

### AWS CLI
<a name="shared_aws_cli"></a>

`update-capability` コマンドを使用して機能を変更します。

```
aws eks update-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name capability-name \
  --role-arn arn:aws:iam::[.replaceable]111122223333:role/NewCapabilityRole
```

**注記**  
作成後にすべての機能プロパティを更新できるわけではありません。変更できる内容の詳細については、機能固有のドキュメントを参照してください。

## 機能を削除する
<a name="_delete_a_capability"></a>

クラスター上で機能が不要になった場合は、機能リソースを削除できます。

**重要**  
 **機能を削除する前に、クラスターリソースを削除します。**  
機能リソースを削除しても、その機能を使用して作成されたリソースは自動的に削除されません。  
すべての Kubernetes カスタムリソース定義 (CRD) は、クラスターにインストールされたままです。
ACK リソースはクラスターに残り、対応する AWS リソースはアカウントに残ります。
Argo CD アプリケーションとその Kubernetes リソースはクラスターに残ります。
kro ResourceGraphDefinitions とインスタンスはクラスターに残ります。
孤立したリソースを回避するため、機能を削除する前に、これらのリソースを削除する必要があります。  
必要に応じて、ACK Kubernetes リソースに関連付けられた AWS リソースを保持することもできます。「[ACK に関する考慮事項](ack-considerations.md)」を参照してください。

### コンソール
<a name="_console_3"></a>

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択して、クラスターの詳細ページを開きます。

1. **[機能]** タブを選択します。

1. **[マネージド機能]** のリストから削除する機能を選択します。

1. **[機能を削除]** を選択します。

1. 確認ダイアログで、機能の名前を入力して削除を確定します。

1. **[削除]** を選択します。

### AWS CLI
<a name="shared_aws_cli"></a>

`delete-capability` コマンドを使用して、機能リソースを削除します。

*region-code* をクラスターがある AWS リージョンに、*my-cluster* をクラスターの名前に、*capacity-name* を削除する機能名に置き換えます。

```
aws eks delete-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name capability-name
```

## 次のステップ
<a name="_next_steps"></a>
+  [機能の Kubernetes リソース](capability-kubernetes-resources.md) – 各機能タイプによって提供される Kubernetes リソースについて説明する
+  [ACK の概念](ack-concepts.md) – ACK の概念およびリソースライフサイクルを理解する
+  [Argo CD の使用](working-with-argocd.md) – GitOps ワークフローに Argo CD 機能を使用する
+  [kro の概念](kro-concepts.md) – kro の概念とリソース構成を理解する

# 機能の Kubernetes リソース
<a name="capability-kubernetes-resources"></a>

クラスターで機能を有効にしたら、後は通常クラスターで Kubernetes カスタムリソースを作成して管理することでクラスターを操作することになります。機能ごとに独自のカスタムリソース定義 (CRD) セットを策定して、それぞれに固有の機能で Kubernetes API を拡張できます。

## Argo CD リソース
<a name="_argo_cd_resources"></a>

Argo CD 機能を有効にすると、次の Kubernetes リソースを作成および管理できます。

 **アプリケーション**   
Git リポジトリからターゲットクラスターへのデプロイを定義します。`Application` リソースでは、ソースリポジトリ、ターゲット名前空間、同期ポリシーを指定します。Argo CD 機能インスタンスごとに最大 1,000 個の `Application` リソースを作成できます。

 **ApplicationSet**   
テンプレートから複数の `Application` リソースを生成し、マルチクラスターとマルチ環境のデプロイを可能にします。`ApplicationSet` リソースは、ジェネレーターを使用して、クラスターリストや Git ディレクトリといったソースに基づいて `Application` リソースを動的に作成します。

 **AppProject**   
`Application` リソースを論理的にグループ化してアクセスを制御します。`AppProject` リソースは、`Application` リソースが使用できるリポジトリ、クラスター、名前空間を定義して、マルチテナンシーとセキュリティ境界を有効にします。

`Application` リソースの例:

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/org/repo
    targetRevision: main
    path: manifests
  destination:
    server: https://kubernetes.default.svc
    namespace: production
```

Argo CD のリソースと概念の詳細については、「[Argo CD の概念](argocd-concepts.md)」を参照してください。

## kro リソース
<a name="_kro_resources"></a>

kro 機能を有効にすると、次の Kubernetes リソースを作成および管理できます。

 **ResourceGraphDefinition (RGD)**   
複数の Kubernetes と AWS リソースを高次の抽象化に構成するカスタム API を定義します。プラットフォームチームは、ガードレールに沿ってパターンを再利用可能できるように `ResourceGraphDefinition` リソースを作成します。

 **カスタムリソースインスタンス**   
`ResourceGraphDefinition` リソースを作成したら、`ResourceGraphDefinition` で定義されたカスタム API のインスタンスを作成できます。kro は、`ResourceGraphDefinition` に指定されたリソースを自動的に作成および管理します。

`ResourceGraphDefinition` リソースの例:

```
apiVersion: kro.run/v1alpha1
kind: ResourceGraphDefinition
metadata:
  name: web-application
spec:
  schema:
    apiVersion: v1alpha1
    kind: WebApplication
    spec:
      name: string
      replicas: integer
  resources:
    - id: deployment
      template:
        apiVersion: apps/v1
        kind: Deployment
        # ... deployment spec
    - id: service
      template:
        apiVersion: v1
        kind: Service
        # ... service spec
```

`WebApplication` インスタンスの例:

```
apiVersion: v1alpha1
kind: WebApplication
metadata:
  name: my-web-app
  namespace: default
spec:
  name: my-web-app
  replicas: 3
```

このインスタンスを適用すると、kro は `ResourceGraphDefinition` に定義された `Deployment` リソースと `Service` リソースを自動的に作成します。

kro のリソースと概念の詳細については、「[kro の概念](kro-concepts.md)」を参照してください。

## ACK リソース
<a name="_ack_resources"></a>

ACK 機能を有効にすると、Kubernetes カスタムリソースを使用して AWS リソースを作成および管理できます。ACK では 50 を超える AWS サービスの 200 を超える CRD を策定できるため、Kubernetes ワークロードと共に AWS リソースを定義し、Kubernetes で専用の AWS インフラストラクチャリソースを管理できます。

ACK リソースの例:

 **S3 バケット**   
 `Bucket` リソースは、バージョニング、暗号化、ライフサイクルポリシーを備えた Amazon S3 バケットを作成および管理します。

 **RDS DBInstance**   
 `DBInstance` リソースは、自動バックアップとメンテナンス期間を備えた Amazon RDS データベースインスタンスをプロビジョニングして管理します。

 **DynamoDB テーブル**   
 `Table` リソースは、プロビジョニング済みのキャパシティまたはオンデマンドキャパシティを備えた DynamoDB テーブルを作成および管理します。

 **IAM ロール**   
 `Role` リソースは、AWS サービスアクセスの信頼ポリシーとアクセス許可ポリシーを備えた IAM ロールを定義します。

 **Lambda 関数**   
 `Function` リソースは、コード、ランタイム、実行ロール設定を備えた Lambda 関数を作成および管理します。

`Bucket` リソースの指定例:

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-app-bucket
spec:
  name: my-unique-bucket-name-12345
  versioning:
    status: Enabled
  encryption:
    rules:
      - applyServerSideEncryptionByDefault:
          sseAlgorithm: AES256
```

ACK のリソースと概念の詳細については、「[ACK の概念](ack-concepts.md)」を参照してください。

## リソースの制限
<a name="_resource_limits"></a>

EKS 機能には、次のリソース制限があります。

 **Argo CD の使用制限**:
+ Argo CD 機能インスタンスあたり最大 1,000 個の `Application` リソース
+ Argo CD 機能インスタンスあたり最大 100 個のリモートクラスターを設定可能

 **リソース設定の制限**:
+ Argo CD では `Application` リソースあたり最大 150 個の Kubernetes リソース
+ kro では `ResourceGraphDefinition` あたり最大 64 個の Kubernetes リソース

**注記**  
これらの制限は、各機能インスタンスで管理されるリソースの数に適用されます。さらに厳しい制限が必要な場合は、複数のクラスターに機能をデプロイできます。

## 次のステップ
<a name="_next_steps"></a>

機能に固有のタスクと高度な設定については、以下のトピックを参照してください。
+  [ACK の概念](ack-concepts.md) – ACK の概念およびリソースライフサイクルを理解する
+  [Argo CD の使用](working-with-argocd.md) – GitOps ワークフローに Argo CD 機能を使用する
+  [kro の概念](kro-concepts.md) – kro の概念とリソース構成を理解する

# EKS 機能と考慮事項
<a name="capabilities-considerations"></a>

このトピックでは、EKS 機能を使用する際の重要な考慮事項について説明します。具体的には、アクセスコントロール設計、EKS 機能かセルフマネージドソリューションかの選択、マルチクラスターデプロイ用のアーキテクチャパターン、運用のベストプラクティスなどです。

## 機能 IAM ロールと Kubernetes RBAC
<a name="_capability_iam_roles_and_kubernetes_rbac"></a>

EKS 機能リソースごとに、機能 IAM ロールが設定されています。機能ロールを使用すると、自分の代わりに EKS 機能を動作させるための AWS サービスアクセス許可を付与できます。例えば、EKS Capability for ACK を使用して Amazon S3 バケットを管理するには、S3 バケットの管理アクセス許可を機能に付与して、バケットを作成および管理できるようにします。

機能を設定すると、クラスター内の Kubernetes カスタムリソースで AWS の S3 リソースを作成および管理できます。Kubernetes RBAC は、こうしたカスタムリソースをどのユーザーとグループが作成および管理できるかを決定するためのクラスター内アクセスコントロールメカニズムです。例えば、特定の Kubernetes RBAC ユーザーとグループに、選択した名前空間で `Bucket` リソースを作成および管理するためのアクセス許可を付与します。

このように、IAM と Kubernetes RBAC は、エンドツーエンドのアクセス管理システムを二等分して、EKS の機能とリソースに関連するアクセス許可を管理しています。ここで重要なのは、ユースケースに適した IAM アクセス許可と RBAC アクセスポリシーを組み合わせることです。

機能 IAM ロールと Kubernetes アクセス許可の詳細については、「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

## マルチクラスターアーキテクチャパターン
<a name="_multi_cluster_architecture_patterns"></a>

複数のクラスターに機能をデプロイする際は、よく使用される次のアーキテクチャパターンを考慮してください。

 **一元管理でのハブとスポーク** 

一元管理クラスターで 3 つすべての機能を実行して、ワークロードをオーケストレーションし、複数のワークロードクラスター全体にわたってクラウドインフラストラクチャを管理します。
+ 管理クラスター上の Argo CD は、リージョンやアカウントが異なる複数のワークロードクラスターにアプリケーションをデプロイします。
+ 管理クラスター上の ACK は、すべてのクラスターの AWS リソース (RDS、S3、IAM) をプロビジョニングします。
+ 管理クラスター上の kro は、すべてのクラスターにわたって動作するポータブルプラットフォーム抽象化を作成します。

このパターンにより、ワークロードとクラウドインフラストラクチャの管理が一元化されるため、組織が多数のクラスターを管理する場合の運用をシンプルにできます。

 **分散型 GitOps** 

ワークロードとクラウドインフラストラクチャは、ワークロードが実行されているのと同じクラスター上の機能で管理されます。
+ Argo CD は、ローカルクラスターのアプリケーションリソースを管理します。
+ ACK リソースは、クラスターとワークロードのニーズに応じて使用されます。
+ kro プラットフォーム抽象化がインストールされ、ローカルリソースをオーケストレーションします。

このパターンでは運用が分散され、各チームは 1 つ以上のクラスターでそれぞれ独自の専用プラットフォームサービスを管理します。

 **ハイブリッド ACK デプロイでのハブとスポーク** 

モデルを一元化および分散すると共に、範囲と所有権に基づいてアプリケーションのデプロイとリソース管理を一元化します。
+ ハブクラスター:
  + Argo CD は、ローカルクラスターとすべてのリモートワークロードクラスターへの GitOps デプロイを管理します。
  + ACK は、管理クラスター上で管理者範囲のリソース (本番稼働用データベース、IAM ロール、VPC) を操作します。
  + kro は、管理クラスター上でプラットフォーム抽象化を再利用可能にします。
+ スポーククラスター:
  + ワークロードは、一元化されたハブクラスター上で Argo CD によって管理されます。
  + ACK は、ローカルでワークロード範囲のリソース (S3 バケット、ElastiCache インスタンス、SQS キュー) を操作します。
  + kro は、ローカルでリソース構成と構成要素パターンを操作します。

このパターンは関心を分離します。プラットフォームチームは管理クラスター上で重要なインフラストラクチャを (必要に応じてワークロードクラスターも) 一元管理し、アプリケーションチームはワークロードと共にクラウドリソースを指定および管理します。

 **パターンを選択する** 

アーキテクチャを選択する場合は、次の要因を考慮してください。
+  **組織構造**: 中央集権型のプラットフォームではハブパターンが好まれますが、分散型のチームではクラスターごとの機能が好まれることがあります。
+  **リソース範囲**: 管理者範囲のリソース (データベース、IAM) は一元管理の方がメリットを得られることが多く、一方ワークロードリソース (バケット、キュー) はローカルで管理することもできます。
+  **セルフサービス**: 中央集権型のプラットフォームチームは、規範的なカスタムリソースを作成および配布して、ワークロードの一般的なニーズに合わせてクラウドリソースの安全なセルフサービスを有効にできます。
+  **クラスターフリート管理**: クラスターを一元管理すると、お客様所有のコントロールプレーンにより、EKS クラスターフリートを他の管理者範囲のリソースと共に管理できます。
+  **コンプライアンス要件**: 組織によっては、監査とガバナンスの一元管理が必要です。
+  **運用の複雑さ**: 機能インスタンスが少ないほど、運用はシンプルになりますが、ボトルネックが発生する可能性があります。

**注記**  
1 つのパターンから始めて、プラットフォームの成熟に伴って別のパターンに進化させていくことができます。機能は独立しているため、ニーズに応じてクラスター間でデプロイ方法を変えることができます。

## EKS 機能をセルフマネージドソリューションと比較する
<a name="_comparing_eks_capabilities_to_self_managed_solutions"></a>

EKS 機能では、EKS で実行される一般的な Kubernetes ツールとコントローラーを完全に管理できます。これは、クラスターにインストールして運用するセルフマネージドソリューションとは異なります。

### 主な違い
<a name="_key_differences"></a>

 **デプロイと管理** 

 AWS が EKS 機能を完全に管理するため、コンポーネントソフトウェアのインストール、設定、メンテナンスが必要ありません。また、AWS はクラスターに必要なすべての Kubernetes カスタムリソース定義 (CRD) を自動的にインストールして管理します。

セルフマネージドソリューションでは、Helm チャート、kubectl、またはその他の演算子を使用して、クラスターソフトウェアをインストールおよび設定します。セルフマネージドソリューションのソフトウェアライフサイクルとランタイム設定を完全に制御できるため、ソリューションのどのレイヤーでもカスタマイズを実施できます。

 **運用とメンテナンス** 

 AWS は、自動更新とセキュリティパッチを使用して、EKS 機能のパッチ適用やその他のソフトウェアライフサイクルの運用を管理します。EKS 機能は、AWS 機能との統合により設定を効率化し、高可用性と耐障害性を備えており、コントローラーワークロードをクラスター内でトラブルシューティングする必要がありません。

セルフマネージドソリューションでは、コンポーネントのヘルスとログのモニタリング、セキュリティパッチとバージョン更新の適用、複数のレプリカとポッド中断の予算による高可用性の設定、コントローラーのワークロードに関する問題のトラブルシューティングと修復、リリースとバージョンの管理を行う必要があります。デプロイを完全に制御できますが、そのためには組織の標準とセキュリティコンプライアンス要件に沿ってプライベートクラスターアクセスやその他の統合を実現するカスタムソリューションが必要です。

 **リソース消費** 

EKS 機能はクラスターとは別に EKS で実行されるため、ノードリソースとクラスターリソースが解放されます。クラスターワークロードリソースを使用せず、ワーカーノード上で CPU やメモリを消費しません。また、自動的にスケールして、クラスターキャパシティプランニングへの影響を最小限に抑えます。

セルフマネージドソリューションは、ワーカーノードでコントローラーやその他のコンポーネントを実行するためのワーカーノードリソース、クラスター IP、その他のクラスターリソースを直接消費します。クラスターサービスを管理するには、ワークロードのキャパシティプランニングが必要であり、スケールと高可用性の要件を管理するためにリソースのリクエストと制限を計画して設定する必要があります。

 **機能のサポート** 

EKS 機能は完全マネージド型のサービス機能であるため、セルフマネージドソリューションと比べると、本質的に自由度が低くなります。ほとんどの特徴とユースケースをサポートしますが、セルフマネージドソリューションと比べると、カバレッジに違いがあります。

セルフマネージドソリューションを使用すると、ソフトウェアの設定やオプションなど機能性のさまざまな側面を完全に制御できます。独自のカスタムイメージを実行する、設定のあらゆる側面をカスタマイズする、セルフマネージドソリューションの機能性を完全に制御するといったこともできます。

 **コストについて** 

EKS 機能のリソースごとに時間単位でコストが伴います。これは機能タイプによって異なります。EKS 機能で管理されるクラスターリソースにも、独自の料金に関連付けられた時間単位のコストが伴います。詳細については「[Amazon EKS の料金](https://aws.amazon.com/eks/pricing/)」を参照してください。

セルフマネージドソリューションには AWS の料金に関連する直接コストはありませんが、コントローラーおよび関連するワークロードでクラスターコンピューティングリソースが使用された場合には料金が発生します。ノードとクラスターのリソースの消費以外にも、セルフマネージドソリューションに伴う総所有コストには、メンテナンス、トラブルシューティング、サポートの運用にかかるオーバーヘッドとコストが含まれます。

### EKS 機能かセルフマネージドソリューションかを選択する
<a name="_choosing_between_eks_capabilities_and_self_managed_solutions"></a>

 **EKS 機能** 基本要件を満たすためにクラスタープラットフォームを運用することではなく、運用オーバーヘッドを削減し、ソフトウェアとシステムの差別化された価値に集中する場合は、この選択肢を検討してください。セキュリティパッチとソフトウェアライフサイクル管理の運用に伴う負担を最小限に抑える、アプリケーションワークロードのノードとクラスターのリソースを解放する、設定とセキュリティ管理をシンプルにする、AWS サポートカバレッジからメリットが得られるといった場合は、EKS 機能を使用します。EKS 機能は、本番稼働のほとんどのユースケースに最適であり、新規デプロイに推奨されるアプローチです。

 **セルフマネージドソリューション** 特定の Kubernetes リソース API バージョンを必要とする、コントローラーを独自に構築する、既存の自動化とツールがセルフマネージドデプロイを軸に構築されている、コントローラーランタイム設定をきめ細かくカスタマイズする必要があるといったは、この選択肢を検討します。セルフマネージドソリューションでは、特殊なユースケースに柔軟に対処し、デプロイとランタイム設定を完全に制御できます。

**注記**  
EKS 機能をクラスター内でセルフマネージドソリューションと共存させることができるため、段階的に移行を進めることができます。

### 機能固有の比較
<a name="_capability_specific_comparisons"></a>

機能に固有の特徴、アップストリームの違い、移行パスなどの詳細な比較については、以下を参照してください。
+  [EKS Capability for ACK とセルフマネージド ACK を比較する](ack-comparison.md) 
+  [EKS Capability for Argo CD とセルフマネージド Argo CD を比較する](argocd-comparison.md) 
+  [EKS Capability for kro とセルフマネージド kro の比較](kro-comparison.md) 

# Kubernetes 用 AWS コントローラー (ACK) で Kubernetes から AWS リソースをデプロイする
<a name="ack"></a>

 Kubernetes 用 AWS コントローラー (ACK) を使用すると、Kubernetes から直接 AWS サービスリソースを定義および管理できます。Kubernetes 用 AWS コントローラー (ACK) により、Kubernetes カスタムリソースを使用してワークロードリソースとクラウドインフラストラクチャを管理できるほか、使い慣れた Kubernetes API とツールを使用してアプリケーションワークロードも管理できます。

AWS では EKS の機能を使用して ACK を完全に管理できるため、クラスターに ACK コントローラーをインストールして保守およびスケールする必要がありません。

## ACK の仕組み
<a name="_how_ack_works"></a>

ACK は、Kubernetes カスタムリソース仕様を AWS API コールに変換します。AWS サービスリソースを表す Kubernetes カスタムリソースを作成、更新、または削除すると、ACK は AWS リソースを作成、更新、または削除するために必要な AWS API コールを実行します。

ACK でサポートされている AWS リソースごとに独自のカスタムリソース定義 (CRD) を用意して、そのリソース設定を指定するための Kubernetes API スキーマを定義します。例えば、S3 の CRD にバケットやバケットポリシーなどの S3 リソースを含めることができます。

ACK は、Kubernetes カスタムリソースに定義された目的の状態に合わせて AWS リソースの状態を継続的に調整します。リソースが目的の状態からドリフトした場合、ACK はそれを検出し、是正アクションを実行して調整し直します。Kubernetes リソースへの変更は、すぐに AWS リソースの状態に反映されます。一方、アップストリームの AWS リソースに対する変更の場合、ドリフトをパッシブに検出して修復するには 10 時間もかかることがありますが (再同期期間)、通常ははるかに早く終了します。

 **S3 バケットリソースマニフェストの例** 

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-ack-bucket
spec:
  name: my-unique-bucket-name
```

このカスタムリソースをクラスターに適用すると、アカウントに Amazon S3 バケットがまだ存在しない場合には ACK によって作成されます。以後、このリソースに変更を加えた場合、例えばデフォルト以外のストレージ階層を指定したりポリシーを追加したりすると、その変更が AWS 内の S3 リソースに適用されます。このリソースがクラスターから削除されると、デフォルトでは AWS 内の S3 バケットも削除されます。

## ACK のメリット
<a name="_benefits_of_ack"></a>

ACK では Kubernetes ネイティブの AWS リソース管理を利用できるため、普段アプリケーションで使用しているのと同じ Kubernetes API とツールで AWS リソースを管理できます。このように統合が図られているため、さまざまなツールを切り替えたり、Infrastructure as Code 管理ワークフローを個別に習得したりする必要がありません。Kubernetes マニフェストで AWS リソースを宣言的に定義して、GitOps ワークフローとインフラストラクチャを、既存の開発プロセスとシームレスに統合するコードプラクティスとして有効にします。

ACK は、AWS リソースの目的の状態を実際の状態で継続的に調整し、ドリフトを修正して、インフラストラクチャ全体の一貫性を確保します。このように継続的に調整することで、AWS リソースに必須の帯域外変更が、宣言した設定に合わせて自動的に元に戻されるため、Infrastructure as Code の整合性が維持されます。複数の AWS アカウントとリージョンにわたるリソースを管理するように ACK を設定することで、他にツールを追加することなく、複雑なマルチアカウントアーキテクチャを実現できます。

組織全体で他のインフラストラクチャ管理ツールから移行するできるように、ACK がリソースの採用をサポートしているため、再作成することなく既存の AWS リソースを ACK の管理下に置くことができます。ACK ではこのほか、読み取り専用リソースにより、変更アクセス権がなくても AWS リソースを監視でき、注釈により、Kubernetes リソースがクラスターから削除された場合でもオプションで AWS リソースを保持できます。

EKS Capability for ACK の詳細と使用開始については、「[ACK の概念](ack-concepts.md)」および「[EKS を利用する場合の ACK の考慮事項](ack-considerations.md)」を参照してください。

## サポートされる AWS サービス
<a name="supported_shared_aws_services"></a>

ACK は、次のような幅広い AWS サービスをサポートしています。
+ Amazon EC2
+ Amazon S3
+ Amazon RDS
+ Amazon DynamoDB
+ Amazon ElastiCache
+ Amazon EKS
+ Amazon SQS
+ Amazon SNS
+  AWS Lambda
+  AWS IAM

一般提供アップストリームとしてリストされているすべての AWS サービスが、EKS Capability for ACK でサポートされています。詳細については、[サポートされている AWS サービスの完全なリスト](https://aws-controllers-k8s.github.io/community/docs/community/services/)を参照してください。

## 他の EKS マネージド機能との統合
<a name="_integration_with_other_eks_managed_capabilities"></a>

ACK は、他の EKS マネージド機能と統合されています。
+  **Argo CD**: Argo CD を使用すると、複数のクラスターにまたがる ACK リソースのデプロイを管理して、AWS インフラストラクチャの GitOps ワークフローを有効にできます。
  + ACK を ArgoCD と組み合わせると GitOps のメリットが広がりますが、ACK を git と統合する必要はありません。
+  **kro (Kube Resource Orchestrator)**: kro を使用すると、ACK リソースから複雑なリソースを作成して、高次の抽象化を作成してリソース管理をシンプルにできます。
  + kro で Kubernetes リソースと AWS リソースの両方を定義することで、複合カスタムリソースを作成できます。チームメンバーは、こうしたカスタムリソースを使用して、複雑なアプリケーションをすばやくデプロイできます。

## ACK の使用を開始する
<a name="_getting_started_with_ack"></a>

EKS Capability for ACK の使用を開始するには:

1. 自分の代わりに ACK で AWS リソースを管理できるように、IAM 機能ロールを作成して、必要なアクセス許可を設定します。

1.  AWS コンソール、AWS CLI、または任意の Infrastructure as Code ツールを使用して、EKS クラスターに [ACK 機能リソースを作成](create-ack-capability.md)します。

1. Kubernetes カスタムリソースをクラスターに適用して、Kubernetes での AWS リソースの管理を開始します。

# ACK 機能を作成する
<a name="create-ack-capability"></a>

この章では、Amazon EKS クラスターに ACK 機能を作成する方法について説明します。

## 前提条件
<a name="_prerequisites"></a>

ACK 機能を作成する前に、以下の点を確認してください。
+ Amazon EKS クラスター
+ ACK で AWS リソースを管理するためのアクセス許可が IAM 機能ロールに付与されている
+ EKS クラスターに機能リソースを作成するための十分な IAM アクセス許可がある
+ 適切な CLI ツールがインストールおよび設定されているか、EKS コンソールにアクセスできる

IAM 機能ロールを作成する手順については、「[Amazon EKS 機能 IAM ロール](capability-role.md)」を参照してください。

**重要**  
ACK は、AWS リソースを作成、変更、削除する権限を付与するインフラストラクチャ管理機能です。これは、制御に慎重を要する管理者範囲の機能です。クラスターに Kubernetes リソースを作成するためのアクセス許可があれば誰でも、IAM 機能ロールのアクセス許可に従って、ACK で AWS リソースを効果的に作成できます。ACK でどの AWS リソースを作成および管理できるかは、どの IAM 機能ロールを使用するかによって決まります。最小特権のアクセス許可を付与した適切なロールを作成する際のガイダンスについては、「[Amazon EKS 機能 IAM ロール](capability-role.md)」および「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

## ツールを選択する
<a name="_choose_your_tool"></a>

AWS マネジメントコンソール、AWS CLI、または eksctl を使用して、ACK 機能を作成できます。
+  [コンソールを使用して ACK 機能を作成する](ack-create-console.md) - 指示に従って操作する場合はコンソールを使用します。
+  [AWS CLI を使用して ACK 機能を作成する](ack-create-cli.md) - スクリプトを作成して自動化を図る場合は AWS CLI を使用します。
+  [eksctl を使用して ACK 機能を作成する](ack-create-eksctl.md) - Kubernetes ネイティブの操作をする場合は eksctl を使用します。

## ACK 機能を作成するとどうなるか
<a name="_what_happens_when_you_create_an_ack_capability"></a>

ACK 機能を作成すると、次のようになります。

1. EKS が、ACK 機能サービスを作成して、クラスター内のリソースをモニタリングおよび管理するように設定します。

1. カスタムリソース定義 (CRD) がクラスターにインストールされます。

1. Kubernetes のベースラインアクセス許可を付与する機能固有のアクセスエントリポリシーを使用して、IAM 機能ロールのアクセスエントリを自動的に作成します (「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照)。

1. 機能が、指定した IAM 機能ロールを引き受けます。

1. ACK が、クラスター内のカスタムリソースを監視し始めます。

1. 機能のステータスが `CREATING` から `ACTIVE` に変わります。

アクティブになったら、AWS リソースを管理するための ACK カスタムリソースをクラスターに作成できます。

**注記**  
自動的に作成されたアクセスエントリには、AWS リソースを管理するための ACK アクセス許可を付与する `AmazonEKSACKPolicy` が含まれます。Kubernetes シークレットを参照する一部の ACK リソース (パスワード付きの RDS データベースなど) には、追加のアクセスエントリポリシーが必要です。アクセスエントリの詳細と追加のアクセス許可の設定方法については、「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

## 次のステップ
<a name="_next_steps"></a>

ACK 機能の作成後:
+  [ACK の概念](ack-concepts.md) - ACK の概念を理解し、AWS リソースの使用を開始する
+  [ACK の概念](ack-concepts.md) - 調整、フィールドエクスポート、リソース採用パターンについて学ぶ
+  [ACK アクセス許可を設定する](ack-permissions.md) - IAM アクセス許可およびマルチアカウントパターンを設定する

# コンソールを使用して ACK 機能を作成する
<a name="ack-create-console"></a>

このトピックでは、AWS マネジメントコンソール を使用して Kubernetes 用 AWS コントローラー (ACK) 機能を作成する方法について説明します。

## ACK 機能を作成する
<a name="_create_the_ack_capability"></a>

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択して、クラスターの詳細ページを開きます。

1. **[機能]** タブを選択します。

1. 左側のナビゲーションで、**[Kubernetes 用 AWS コントローラー (ACK)]** を選択します。

1. **[Kubernetes 用 AWS コントローラー (ACK) 機能]** を選択します。

1. **IAM 機能ロール**に対して以下の操作を行います。
   + IAM 機能ロールが既に存在する場合は、ドロップダウンから選択します。
   + ロールを作成する必要がある場合は、**[管理者ロールを作成]** を選択します。

     IAM コンソールが新しいタブに開かれます。信頼ポリシーと `AdministratorAccess` 管理ポリシーには、値があらかじめ入力されています。このポリシーを選択解除し、必要に応じて他のアクセス許可を追加できます。

     ロールを作成して EKS コンソールに戻ると、そのロールが自動的に選択されます。
**重要**  
提案された `AdministratorAccess` ポリシーは、幅広いアクセス許可を付与し、使用開始を効率化することを目的としています。本番稼働で使用する場合は、これをカスタムポリシーに置き換えて、そのポリシーでは ACK で管理する特定の AWS サービスに必要なアクセス許可のみを付与します。最小特権ポリシーを作成する際のガイダンスについては、「[ACK アクセス許可を設定する](ack-permissions.md)」および「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

1. **[作成]** を選択します。

機能作成プロセスが始まります。

## 機能がアクティブであることを確認する
<a name="_verify_the_capability_is_active"></a>

1. **[機能]** タブで、ACK 機能のステータスを表示します。

1. ステータスが `CREATING` から `ACTIVE` に変わるまで待ちます。

1. アクティブになったら、この機能を使用する準備は完了です。

機能のステータスとトラブルシューティングの詳細については、「[機能リソースの使用](working-with-capabilities.md)」を参照してください。

## カスタムリソースが使用可能であることを確認する
<a name="_verify_custom_resources_are_available"></a>

機能がアクティブになったら、ACK カスタムリソースがクラスターで使用可能になっていることを確認します。

 **コンソールの使用** 

1. Amazon EKS コントロールでクラスターに移動します。

1. **[リソース]** タブを選択します。

1. **[拡張機能]** を選択します。

1. **[CustomResourceDefinitions]** を選択します。

AWS リソースに使用可能な多数の CRD がリストされます。

 **kubectl を使用する** 

```
kubectl api-resources | grep services.k8s.aws
```

AWS リソースに使用可能な多数の API がリストされます。

**注記**  
Kubernetes 用 AWS コントローラーの機能は、さまざまな AWS リソース用に多数の CRD をインストールします。

## 次のステップ
<a name="_next_steps"></a>
+  [ACK の概念](ack-concepts.md) - ACK の概念を理解して使用を開始する
+  [ACK アクセス許可を設定する](ack-permissions.md) - 他の AWS サービスに対して IAM アクセス許可を設定する
+  [機能リソースの使用](working-with-capabilities.md) - ACK 機能リソースを管理する

# AWS CLI を使用して ACK 機能を作成する
<a name="ack-create-cli"></a>

このトピックでは、AWS CLI を使用して Kubernetes 用 AWS コントローラー (ACK) 機能を作成する方法について説明します。

## 前提条件
<a name="_prerequisites"></a>
+  **AWS CLI** バージョン `2.12.3` 以降。バージョンを確認するには、`aws --version` を実行します。詳細についてはAWS コマンドラインインターフェイスユーザーガイドの「[インストール](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)」を参照してください。
+  **`kubectl`** - Kubernetes クラスターを操作するためのコマンドラインツール。詳細については、「[`kubectl` および `eksctl` のセットアップ](install-kubectl.md)」を参照してください。

## ステップ 1: IAM 機能ロールを作成する
<a name="_step_1_create_an_iam_capability_role"></a>

信頼ポリシーファイルを作成します。

```
cat > ack-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

IAM ロールを作成します。

```
aws iam create-role \
  --role-name ACKCapabilityRole \
  --assume-role-policy-document file://ack-trust-policy.json
```

`AdministratorAccess` マネージドポリシーをロールにアタッチします。

```
aws iam attach-role-policy \
  --role-name ACKCapabilityRole \
  --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
```

**重要**  
提案された `AdministratorAccess` ポリシーは、幅広いアクセス許可を付与し、使用開始を効率化することを目的としています。本番稼働で使用する場合は、これをカスタムポリシーに置き換えて、そのポリシーでは ACK で管理する特定の AWS サービスに必要なアクセス許可のみを付与します。最小特権ポリシーを作成する際のガイダンスについては、「[ACK アクセス許可を設定する](ack-permissions.md)」および「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

## ステップ 2: ACK 機能を作成する
<a name="_step_2_create_the_ack_capability"></a>

ACK 機能リソースをクラスターに作成します。*region-code* はクラスターがある AWS リージョンに、*my-cluster* はクラスターの名前に置き換えます。

```
aws eks create-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-ack \
  --type ACK \
  --role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/ACKCapabilityRole \
  --delete-propagation-policy RETAIN
```

このコマンドはすぐに戻りますが、EKS が必要な機能インフラストラクチャとコンポーネントを作成するため、機能がアクティブになるまでにはしばらく時間がかかります。EKS は、この機能に関連する Kubernetes カスタムリソース定義をその作成時にクラスターにインストールします。

**注記**  
クラスターが存在しないというエラーやアクセス許可がないというエラーが表示された場合は、以下の点を確認します。  
クラスター名が正しいこと
AWS CLI が正しいリージョンに設定されていること
必要な IAM アクセス許可を追加したこと

## ステップ 3: 機能がアクティブであることを確認する
<a name="_step_3_verify_the_capability_is_active"></a>

機能がアクティブになるまで待機します。*region-code* はクラスターがある AWS リージョンに、*my-cluster* はクラスターの名前に置き換えます。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-ack \
  --query 'capability.status' \
  --output text
```

ステータスが `ACTIVE` と表示されたら、機能の準備は完了です。ステータスが `ACTIVE` になるまで、次のステップに進まないでください。

機能の詳細全体を表示することもできます。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-ack
```

## ステップ 4: カスタムリソースが使用可能であることを確認する
<a name="_step_4_verify_custom_resources_are_available"></a>

機能がアクティブになったら、ACK カスタムリソースがクラスターで使用可能になっていることを確認します。

```
kubectl api-resources | grep services.k8s.aws
```

AWS リソースに使用可能な多数の API がリストされます。

**注記**  
Kubernetes 用 AWS コントローラーの機能は、さまざまな AWS リソース用に多数の CRD をインストールします。

## 次のステップ
<a name="_next_steps"></a>
+  [ACK の概念](ack-concepts.md) - ACK の概念を理解して使用を開始する
+  [ACK アクセス許可を設定する](ack-permissions.md) - 他の AWS サービスに対して IAM アクセス許可を設定する
+  [機能リソースの使用](working-with-capabilities.md) - ACK 機能リソースを管理する

# eksctl を使用して ACK 機能を作成する
<a name="ack-create-eksctl"></a>

このトピックでは、eksctl を使用して Kubernetes 用 AWS コントローラー (ACK) 機能を作成する方法について説明します。

**注記**  
以下のステップを実行するには、eksctl バージョン `0.220.0` 以降が必要です。バージョンを確認するには、`eksctl version` を実行します。

## ステップ 1: IAM 機能ロールを作成する
<a name="_step_1_create_an_iam_capability_role"></a>

信頼ポリシーファイルを作成します。

```
cat > ack-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

IAM ロールを作成します。

```
aws iam create-role \
  --role-name ACKCapabilityRole \
  --assume-role-policy-document file://ack-trust-policy.json
```

`AdministratorAccess` マネージドポリシーをロールにアタッチします。

```
aws iam attach-role-policy \
  --role-name ACKCapabilityRole \
  --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
```

**重要**  
提案された `AdministratorAccess` ポリシーは、幅広いアクセス許可を付与し、使用開始を効率化することを目的としています。本番稼働で使用する場合は、これをカスタムポリシーに置き換えて、そのポリシーでは ACK で管理する特定の AWS サービスに必要なアクセス許可のみを付与します。最小特権ポリシーを作成する際のガイダンスについては、「[ACK アクセス許可を設定する](ack-permissions.md)」および「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

**重要**  
このポリシーは、`"Resource": "*"` で S3 バケット管理に必要なアクセス許可を付与して、すべての S3 バケットに対してオペレーションを実行できるようにします。  
本番稼働で使用する場合: \$1 `Resource` フィールドを特定のバケット ARN または名前パターンに制限します。\$1 IAM 条件キーを使用すると、リソースタグでアクセスを制限できます。\$1 ユースケースに必要な最小限のアクセス許可のみを付与します。  
その他の AWS サービスについては、「[ACK アクセス許可を設定する](ack-permissions.md)」を参照してください。

ロールにポリシーを付与します。

```
aws iam attach-role-policy \
  --role-name ACKCapabilityRole \
  --policy-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):policy/ACKS3Policy
```

## ステップ 2: ACK 機能を作成する
<a name="_step_2_create_the_ack_capability"></a>

eksctl を使用して ACK 機能を作成します。*region-code* はクラスターがある AWS リージョンに、*my-cluster* はクラスターの名前に置き換えます。

```
eksctl create capability \
  --cluster [.replaceable]`my-cluster` \
  --region [.replaceable]`region-code` \
  --name ack \
  --type ACK \
  --role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/ACKCapabilityRole \
  --ack-service-controllers s3
```

**注記**  
`--ack-service-controllers` フラグはオプションです。省略した場合、ACK は使用可能なすべてのコントローラーを有効にします。パフォーマンスとセキュリティを高めるため、必要なコントローラーのみを有効にすることを検討してください。`--ack-service-controllers s3,rds,dynamodb` のように、複数のコントローラーを指定できます。

このコマンドはすぐに戻りますが、機能がアクティブになるまでにはしばらく時間がかかります。

## ステップ 3: 機能がアクティブであることを確認する
<a name="_step_3_verify_the_capability_is_active"></a>

機能のステータスを確認します。

```
eksctl get capability \
  --cluster [.replaceable]`my-cluster` \
  --region [.replaceable]`region-code` \
  --name ack
```

ステータスが `ACTIVE` と表示されたら、機能の準備は完了です。

## ステップ 4: カスタムリソースが使用可能であることを確認する
<a name="_step_4_verify_custom_resources_are_available"></a>

機能がアクティブになったら、ACK カスタムリソースがクラスターで使用可能になっていることを確認します。

```
kubectl api-resources | grep services.k8s.aws
```

AWS リソースに使用可能な多数の API がリストされます。

**注記**  
Kubernetes 用 AWS コントローラーの機能は、さまざまな AWS リソース用に多数の CRD をインストールします。

## 次のステップ
<a name="_next_steps"></a>
+  [ACK の概念](ack-concepts.md) - ACK の概念を理解して使用を開始する
+  [ACK アクセス許可を設定する](ack-permissions.md) - 他の AWS サービスに対して IAM アクセス許可を設定する
+  [機能リソースの使用](working-with-capabilities.md) - ACK 機能リソースを管理する

# ACK の概念
<a name="ack-concepts"></a>

ACK は、AWS の実際の状態に照らしてマニフェストの目的の状態を継続的に調整することで、Kubernetes API を利用して AWS リソースを管理します。Kubernetes カスタムリソースを作成または更新すると、ACK は対応する AWS リソースを作成または変更するために必要な AWS API コールを実行し、ドリフトがないかモニタリングして、現在の状態を反映するように Kubernetes ステータスを更新します。このアプローチにより、クラスターと AWS との一貫性を維持しながら、使い慣れた Kubernetes ツールとワークフローを使用してインフラストラクチャを管理できます。

このトピックでは、ACK が Kubernetes API を利用して AWS リソースを管理する際の土台となる概念について説明します。

## ACK の使用を開始する
<a name="_getting_started_with_ack"></a>

ACK 機能を作成したら (「[ACK 機能を作成する](create-ack-capability.md)」を参照)、クラスターで Kubernetes マニフェストを使用して AWS リソースの管理を開始できます。

例えば、`bucket.yaml` でこの S3 バケットマニフェストを作成して、独自のバケット名を選択します。

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-test-bucket
  namespace: default
spec:
  name: my-unique-bucket-name-12345
```

マニフェストを適用します。

```
kubectl apply -f bucket.yaml
```

ステータスを確認します。

```
kubectl get bucket my-test-bucket
kubectl describe bucket my-test-bucket
```

AWS にバケットが作成されたことを確認します。

```
aws s3 ls | grep my-unique-bucket-name-12345
```

Kubernetes リソースを削除します。

```
kubectl delete bucket my-test-bucket
```

AWS からバケットが削除されたことを確認します。

```
aws s3 ls | grep my-unique-bucket-name-12345
```

バケットがリストに表示されなくなるはずです。つまり、ACK で AWS リソースのライフサイクル全体を管理できていることになります。

ACK の使用を開始する方法の詳細については、「[ACK の使用を開始する](https://aws-controllers-k8s.github.io/community/docs/user-docs/getting-started/)」を参照してください。

## リソースのライフサイクルと調整
<a name="_resource_lifecycle_and_reconciliation"></a>

ACK は、継続的な調整ループを使用して、AWS リソースが Kubernetes マニフェストに定義された目的の状態と一致するようにします。

 **調整の仕組み**:

1. ユーザーが Kubernetes カスタムリソース (S3 バケットなど) を作成または更新します。

1. ACK がその変更を検出し、目的の状態を AWS の実際の状態と比較します。

1. 両者が異なる場合、ACK は AWS API コールを実行して差分を調整します。

1. ACK が現在の状態を反映するように Kubernetes のリソースステータスを更新します。

1. このループが通常数時間ごとに継続的に繰り返されます。

調整がトリガーされるのは、Kubernetes リソースを新規に作成したとき、既存のリソースの `spec` を更新したとき、または ACK 外での手動変更によって AWS でドリフトが発生したことを ACK が検出したときです。また、ACK は 10 時間という再同期期間で定期的に調整を行います。Kubernetes リソースを変更した場合は即時調整がトリガーされるのに対して、アップストリームの AWS リソースを変更した場合はパッシブなドリフト検出が定期的な再同期で行われます。

上記のように使用を開始すると、ACK は次のステップを実行します。

1. バケットが AWS に存在するかどうかを確認します。

1. 存在しない場合は、`s3:CreateBucket` を呼び出します。

1. バケットの ARN と状態で Kubernetes ステータスを更新します。

1. ドリフトがないか継続的にモニタリングします。

ACK の仕組みの詳細については、「[ACK 調整](https://aws-controllers-k8s.github.io/community/docs/user-docs/reconciliation/)」を参照してください。

## ステータス条件
<a name="_status_conditions"></a>

ACK リソースは、ステータス条件を使用してリソースの状態を伝えます。ステータス条件を理解すると、問題のトラブルシューティングとリソース状態の把握に役立ちます。
+  **Ready**: リソースを消費する準備ができていることを示します (標準化された Kubernetes 条件)。
+  **ACK.ResourceSynced**: リソース仕様が AWS リソースの状態と一致することを示します。
+  **ACK.Terminal**: 回復不能なエラーが発生したことを示します。
+  **ACK.Adopted**: リソースが新規に作成されたのではなく既存の AWS リソースから採用されたことを示します。
+  **ACK.Recoverable**: 回復可能なエラーであるものの、仕様を更新することなく解決可能であることを示します。
+  **ACK.Advisory**: リソースのアドバイザリ情報を提供します。
+  **ACK.LateInitialized**: フィールドの遅延初期化が完了しているかどうかを示します。
+  **ACK.ReferencesResolved**: すべての `AWSResourceReference` フィールドが解決されたかどうかを示します。
+  **ACK.IAMRoleSelected**: このリソースを管理するために IAMRoleSelector が選択されたかどうかを示します。

リソースのステータスを確認する:

```
# Check if resource is ready
kubectl get bucket my-bucket -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'

# Check for terminal errors
kubectl get bucket my-bucket -o jsonpath='{.status.conditions[?(@.type=="ACK.Terminal")]}'
```

ステータスの例:

```
status:
  conditions:
  - type: Ready
    status: "True"
    lastTransitionTime: "2024-01-15T10:30:00Z"
  - type: ACK.ResourceSynced
    status: "True"
    lastTransitionTime: "2024-01-15T10:30:00Z"
  - type: ACK.Terminal
    status: "True"
  ackResourceMetadata:
    arn: arn:aws:s3:::my-unique-bucket-name
    ownerAccountID: "111122223333"
    region: us-west-2
```

ACK のステータスと条件の詳細については、「[ACK の条件](https://aws-controllers-k8s.github.io/community/docs/user-docs/conditions/)」を参照してください。

## 削除ポリシー
<a name="_deletion_policies"></a>

ACK の削除ポリシーは、Kubernetes AWS リソースを削除したときにリソースがどうなるかを制御します。

 **削除する (デフォルト)** 

Kubernetes リソースを削除すると、AWS リソースも削除されます。これがデフォルトの動作です。

```
# No annotation needed - this is the default
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: temp-bucket
spec:
  name: temporary-bucket
```

このリソースを削除すると、AWS の S3 バケットも削除されます。

 **Retain**: 

AWS リソースは、Kubernetes リソースを削除しても保持されます。

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: important-bucket
  annotations:
    services.k8s.aws/deletion-policy: "retain"
spec:
  name: production-data-bucket
```

このリソースを削除すると、Kubernetes から削除されますが、S3 バケットは AWS に残ります。

本番稼働用データベースでは、Kubernetes リソース、複数のアプリケーションで使用される共有リソース、誤って削除されてはならない重要なデータがあるリソースを長く維持する必要があります。また、リソースを採用して設定した後、手動管理に戻すという一時的な ACK 管理も必要です。`retain` ポリシーは、こうした用途に有益です。

ACK 削除ポリシーの詳細については、「[ACK 削除ポリシー](https://aws-controllers-k8s.github.io/community/docs/user-docs/deletion-policy/)」を参照してください。

## リソースの採用
<a name="_resource_adoption"></a>

リソースを採用すると、既存の AWS リソースを再作成することなく ACK の管理下に置くことができます。

どのような場合に採用するか:
+ 既存のインフラストラクチャを ACK 管理に移行する場合
+ Kubernetes で AWS リソースを誤って削除したときに孤立したリソースを復旧する場合
+ 他のツール (CloudFormation や Terraform) で作成されたリソースをインポートする場合

採用の仕組み:

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: existing-bucket
  annotations:
    services.k8s.aws/adoption-policy: "adopt-or-create"
spec:
  name: my-existing-bucket-name
```

このリソースを作成すると、次のようになります。

1. ACK が、その名前のバケットが AWS に存在するかどうかを確認します。

1. 存在すれば、ACK はそのバケットを採用します (API コールは作成されません)。

1. ACK が AWS から現在の設定を読み取ります。

1. ACK が実際の状態を反映するように Kubernetes ステータスを更新します。

1. 今後の更新でリソースを正常に調整します。

採用されたら、リソースは他の ACK リソースと同様に管理され、`retain` 削除ポリシーを使用しない限り、Kubernetes リソースを削除すると、AWS リソースも削除されます。

リソースを採用するときに、AWS リソースは既に存在している必要があり、それを検出するためには ACK に読み取りアクセス許可が必要です。`adopt-or-create` ポリシーは、リソースが存在すれば採用し、存在しなければ作成します。これは、リソースが存在するかどうかにかかわらず宣言型ワークフローを機能させるときに便利です。

ACK リソースの採用の詳細については、「[ACK リソースの採用](https://aws-controllers-k8s.github.io/community/docs/user-docs/adopted-resource/)」を参照してください。

## クロスアカウントおよびクロスリージョンのリソース
<a name="_cross_account_and_cross_region_resources"></a>

ACK は、1 つのクラスターからさまざまな AWS アカウントとリージョンのリソースを管理できます。

 **クロスリージョンリソースの注釈** 

注釈を使用すると、AWS リソースのリージョンを指定できます。

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: eu-bucket
  annotations:
    services.k8s.aws/region: eu-west-1
spec:
  name: my-eu-bucket
```

特定の名前空間に作成されたすべての AWS リソースのリージョンを指定することもできます。

 **名前空間の注釈** 

名前空間内のすべてのリソースに対してデフォルトのリージョンを設定します。

```
apiVersion: v1
kind: Namespace
metadata:
  name: production
  annotations:
    services.k8s.aws/default-region: us-west-2
```

この名前空間に作成されたリソースは、リソースレベルの注釈で上書きされない限り、このリージョンを使用します。

 **クロスアカウント** 

IAM ロールセレクターを使用すると、特定の IAM ロールを名前空間にマッピングできます。

```
apiVersion: services.k8s.aws/v1alpha1
kind: IAMRoleSelector
metadata:
  name: target-account-config
spec:
  arn: arn:aws:iam::444455556666:role/ACKTargetAccountRole
  namespaceSelector:
    names:
      - production
```

マッピングされた名前空間に作成されたリソースは、指定されたロールを自動的に使用します。

IAM ロールセレクターの詳細については、「[ACK クロスアカウントリソース管理](https://aws-controllers-k8s.github.io/docs/guides/cross-account)」を参照してください。クロスアカウント設定の詳細については、「[ACK アクセス許可を設定する](ack-permissions.md)」を参照してください。

## エラー処理と再試行動作
<a name="_error_handling_and_retry_behavior"></a>

ACK は、一時的なエラーを自動的に処理し、失敗したオペレーションを再試行します。

再試行戦略:
+ 一時的なエラー (レート制限、サービスの一時的な問題、不十分なアクセス許可) が発生したら、自動再試行をトリガーします。
+ エクスポネンシャルバックオフにより、AWS API が過剰になるのを防ぎます。
+ エラータイプに応じて最大再試行回数を変えます。
+ 永続的なエラー (無効なパラメータ、リソース名の競合) は再試行されません。

`kubectl describe` を使用して、エラーの詳しい情報がないかリソースのステータスを確認します。

```
kubectl describe bucket my-bucket
```

エラーメッセージでステータス条件を確認し、最近調整を試みたことを示すイベントがないかチェックし、ステータス条件の `message` フィールドで障害に関する説明を参照します。よくあるエラーには、IAM アクセス許可が十分でない、AWS でリソース名が競合している、`spec` に無効な設定値がある、AWS サービスクォータが超過しているといったことがあります。

よくあるエラーのトラブルシューティングについては、「[ACK 機能に関する問題をトラブルシューティングする](ack-troubleshooting.md)」を参照してください。

## kro によるリソース構成
<a name="_resource_composition_with_kro"></a>

複数の ACK リソースをまとめて作成および接続するには、EKS Capability for kro (Kube Resource Orchestrator) を使用します。kro を使用すると、リソースのグループを宣言的に定義し、リソース間で設定を渡して、複雑なインフラストラクチャパターンを容易に管理できます。

ACK リソースでカスタムリソース構成を作成する詳細な例については、「[kro の概念](kro-concepts.md)」を参照してください。

## 次のステップ
<a name="_next_steps"></a>
+  [EKS を利用する場合の ACK の考慮事項](ack-considerations.md) - EKS に固有のパターンと統合戦略

# ACK アクセス許可を設定する
<a name="ack-permissions"></a>

自分の代わりに ACK で AWS リソースを作成および管理できるようにするには、IAM アクセス許可が必要です。このトピックでは、IAM が ACK でどのように機能するかを説明し、さまざまなユースケースに合わせてアクセス許可を設定する際のガイダンスを示します。

## IAM は ACK でどのように機能するか
<a name="_how_iam_works_with_ack"></a>

ACK は、IAM ロールを使用して AWS で認証し、リソースに対してアクションを実行します。ACK にアクセス許可を付与する方法が 2 つあります。

 **機能ロール**: ACK 機能の作成時に指定する IAM ロールです。このロールは、デフォルトではすべての ACK オペレーションに使用されます。

 **IAM ロールセレクター**: 特定の名前空間またはリソースにマッピングできる追加の IAM ロールです。これらのロールの範囲内にあるリソースの機能ロールは上書きされます。

リソースを作成または管理する必要があるときに、ACK はどの IAM ロールを使用するかを決定します。

1. IAMRoleSelector がリソースの名前空間に一致するかどうかを確認します。

1. 一致した場合、その IAM ロールを引き受けます。

1. 一致しない場合、機能ロールを使用します。

このアプローチにより、シンプルな単一ロールセットアップから複雑なマルチアカウントかつマルチチームの設定まで、アクセス許可を柔軟に管理できます。

## 使用開始: シンプルなアクセス許可セットアップ
<a name="_getting_started_simple_permission_setup"></a>

開発、テスト、またはシンプルなユースケースの場合、必要なすべてのサービスアクセス許可を機能ロールに直接追加できます。

このアプローチは、次の場合に適しています。
+ ACK の使用を開始している
+ すべてのリソースが同じ AWS アカウントにある
+ 1 つのチームがすべての ACK リソースを管理する
+ すべての ACK ユーザーに同じアクセス許可が付与されていると確信している

## 本番稼働でのベストプラクティス: IAM ロールセレクター
<a name="_production_best_practice_iam_role_selectors"></a>

本番稼働環境では、IAM ロールセレクターを使用して、最小特権のアクセスと名前空間レベルでの分離を実装します。

IAM ロールセレクターを使用する場合、機能ロールに必要なアクセス許可はサービス固有のロールを引き受けるための `sts:AssumeRole` および `sts:TagSession` アクセス許可だけです。機能ロール自体に AWS サービスアクセス許可 (S3 や RDS など) を追加する必要はありません。そうしたアクセス許可は、機能ロールが引き受ける個々の IAM ロールに付与します。

 **アクセス許可モデルを選択する**:

次の場合は、**直接アクセス許可** (機能ロールにサービスアクセス許可を追加すること) を使用します。
+ 使用を開始し、最もシンプルなセットアップにする場合
+ すべてのリソースがクラスターと同じアカウントにある場合
+ クラスター全体の管理アクセス許可を必要とする場合
+ すべてのチームが同じアクセス許可を共有できる場合

次の場合は、**IAM ロールセレクター**を使用します。
+ 複数の AWS アカウント全体のリソースを管理する場合
+ チームや名前空間ごとに異なるアクセス許可が必要な場合
+ 名前空間ごとにきめ細かなアクセスコントロールが必要な場合
+ 最小特権のセキュリティプラクティスに従う場合

直接アクセス許可から開始し、その後、要件の増大に応じて IAM ロールセレクターに移行できます。

 **なぜ本番稼働で IAM ロールセレクターを使用するのか:** 
+  **最小特権**: 名前空間ごとに必要なアクセス許可のみを取得します。
+  **チーム分離**: チーム A が誤ってチーム B のアクセス許可を使用することがないようにします。
+  **容易な監査**: どの名前空間がどのロールを使用するかを明確にマッピングします。
+  **クロスアカウントサポート**: 複数のアカウントのリソースを管理する場合に必要です。
+  **関心の分離**: サービスや環境ごとに異なるロールを使用します。

### 基本的な IAM ロールセレクターのセットアップ
<a name="_basic_iam_role_selector_setup"></a>

 **ステップ 1: サービス固有の IAM ロールを作成する** 

特定の AWS サービスに対するアクセス許可を付与した IAM ロールを作成します。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": "*"
    }
  ]
}
```

機能ロールに引き受けられるように信頼ポリシーを設定します。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/ACKCapabilityRole"
      },
      "Action": ["sts:AssumeRole", "sts:TagSession"]
    }
  ]
}
```

 **ステップ 2: AssumeRole アクセス許可を機能ロールに付与する** 

サービス固有のロールを引き受けるためのアクセス許可を機能ロールに追加します。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["sts:AssumeRole", "sts:TagSession"],
      "Resource": "arn:aws:iam::111122223333:role/ACK-S3-Role"
    }
  ]
}
```

 **ステップ 3: IAMRoleSelector を作成する** 

名前空間に IAM ロールをマッピングします。

```
apiVersion: services.k8s.aws/v1alpha1
kind: IAMRoleSelector
metadata:
  name: s3-namespace-config
spec:
  arn: arn:aws:iam::111122223333:role/ACK-S3-Role
  namespaceSelector:
    names:
      - s3-resources
```

 **ステップ 4: マッピングした名前空間にリソースを作成する** 

`s3-resources` 名前空間内のリソースは、指定されたロールを自動的に使用します。

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-bucket
  namespace: s3-resources
spec:
  name: my-production-bucket
```

## マルチアカウント管理
<a name="_multi_account_management"></a>

IAM ロールセレクターを使用すると、複数の AWS アカウントのリソースを管理できます。

 **ステップ 1: クロスアカウント IAM ロールを作成する** 

ターゲットアカウント (444455556666) に、ソースアカウントの機能ロールを信頼するロールを作成します。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/ACKCapabilityRole"
      },
      "Action": ["sts:AssumeRole", "sts:TagSession"]
    }
  ]
}
```

このロールにサービス固有のアクセス許可をアタッチします。

 **ステップ 2: AssumeRole アクセス許可を付与する** 

ソースアカウント (111122223333) で、機能ロールがターゲットアカウントロールを引き受けられるようにします。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["sts:AssumeRole", "sts:TagSession"],
      "Resource": "arn:aws:iam::444455556666:role/ACKTargetAccountRole"
    }
  ]
}
```

 **ステップ 3: IAMRoleSelector を作成する** 

名前空間にクロスアカウントロールをマッピングします。

```
apiVersion: services.k8s.aws/v1alpha1
kind: IAMRoleSelector
metadata:
  name: production-account-config
spec:
  arn: arn:aws:iam::444455556666:role/ACKTargetAccountRole
  namespaceSelector:
    names:
      - production
```

 **ステップ 4: リソースを作成する** 

`production` 名前空間内のリソースは、ターゲットアカウントに作成します。

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-bucket
  namespace: production
spec:
  name: my-cross-account-bucket
```

## セッションタグ
<a name="_session_tags"></a>

EKS ACK 機能は、すべての AWS API リクエストにセッションタグを自動的に設定します。これらのタグは、各リクエストのソースを特定することで、きめ細かなアクセスコントロールと監査を可能にします。

### 利用可能なセッションタグ
<a name="_available_session_tags"></a>

ACK によって行われるすべての AWS API コールには、次のセッションタグが含まれています。


| タグキー | 説明 | 
| --- | --- | 
|   `eks:eks-capability-arn`   |  リクエストを行う EKS 機能の ARN  | 
|   `eks:kubernetes-namespace`   |  管理対象のリソースの Kubernetes 名前空間  | 
|   `eks:kubernetes-api-group`   |  リソースの Kubernetes API グループ (例: `s3.services.k8s.aws`)  | 

### セッションタグを使用したアクセス制御
<a name="_using_session_tags_for_access_control"></a>

これらのセッションタグを IAM ポリシー条件で使用して、ACK が管理できるリソースを制限できます。これにより、名前空間ベースの IAM ロールセレクターに加えて追加セキュリティレイヤーが設定されます。

 **例: 名前空間による制限** 

リクエストが `production` 名前空間から発信された場合にのみ、ACK が S3 バケットを作成できるようにします。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:CreateBucket",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/eks:kubernetes-namespace": "production"
        }
      }
    }
  ]
}
```

 **例: 機能による制限** 

特定の ACK 機能からのアクションのみを許可します。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/eks:eks-capability-arn": "arn:aws:eks:us-west-2:111122223333:capability/my-cluster/ack/my-ack"
        }
      }
    }
  ]
}
```

**注記**  
セッションタグは、デフォルトでこれらのタグを設定しないセルフマネージド ACK とは異なります。これにより、マネージド機能によるより詳細なアクセスコントロールが可能になります。

## 高度な IAM ロールセレクターパターン
<a name="_advanced_iam_role_selector_patterns"></a>

ラベルセレクターやリソース固有のロールマッピングなどの例に見られる高度な設定については、「[ACK IRSA ドキュメント](https://aws-controllers-k8s.github.io/community/docs/user-docs/irsa/)」を参照してください。

## 次のステップ
<a name="_next_steps"></a>
+  [ACK の概念](ack-concepts.md) - ACK の概念およびリソースライフサイクルを理解する
+  [ACK の概念](ack-concepts.md) - リソースの採用と削除ポリシーについて学ぶ
+  [EKS 機能のセキュリティに関する考慮事項](capabilities-security.md) - 機能のセキュリティベストプラクティスを理解する

# EKS を利用する場合の ACK の考慮事項
<a name="ack-considerations"></a>

このトピックでは、IAM 設定、マルチアカウントパターン、他の EKS 機能との統合など、EKS Capability for ACK を使用する際の重要な考慮事項について説明します。

## IAM 設定のパターン
<a name="_iam_configuration_patterns"></a>

ACK 機能は、IAM 機能ロールを使用して AWS で認証します。要件に基づいて適切な IAM パターンを選択します。

### シンプル: 単一の機能ロール
<a name="_simple_single_capability_role"></a>

開発、テスト、またはシンプルなユースケースの場合、必要なすべてのアクセス許可を機能ロールに直接付与します。

 **どのようなときに使うか**:
+ ACK の使用を開始する
+ シングルアカウントでデプロイする
+ 1 つのチームがすべてのリソースを管理する
+ 開発環境とテスト環境

 **例**: リソースのタグ付け条件に従って、S3 と RDS のアクセス許可を機能ロールに追加します。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": ["us-west-2", "us-east-1"]
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": ["rds:*"],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": ["us-west-2", "us-east-1"]
        },
      }
    }
  ]
}
```

この例では、S3 と RDS のオペレーションを特定のリージョンに制限し、RDS リソースに `ManagedBy: ACK` タグが必要です。

### 本番稼働: IAM ロールセレクター
<a name="_production_iam_role_selectors"></a>

本番稼働環境では、IAM ロールセレクターを使用して、最小特権のアクセスと名前空間レベルでの分離を実装します。

 **どのようなときに使うか**:
+ 本番稼働環境
+ マルチチームクラスター
+ マルチアカウントリソース管理
+ 最小特権セキュリティ要件
+ サービスごとに異なるアクセス許可が必要

 **利点:**
+ 名前空間ごとに必要なアクセス許可のみを取得できます。
+ チーム分離 - チーム A は、チーム B のアクセス許可を使用できません。
+ 監査とコンプライアンスが容易です。
+ クロスアカウントリソース管理に必須です。

IAM ロールセレクターの設定の詳細については、「[ACK アクセス許可を設定する](ack-permissions.md)」を参照してください。

## 他の EKS 機能との統合
<a name="_integration_with_other_eks_capabilities"></a>

### GitOps と Argo CD
<a name="_gitops_with_argo_cd"></a>

EKS Capability for Argo CD を使用すると、Git リポジトリから ACK リソースをデプロイして、インフラストラクチャの管理に GitOps ワークフローを使用できます。

 **考慮事項**:
+ エンドツーエンドの GitOps のアプリケーションマニフェストと共に ACK リソースを保存する
+ チーム構造に基づいて環境、サービス、またはリソースタイプ別に整理する
+ Argo CD の自動同期を使用して継続的に調整を行う
+ プルーニングを有効にして削除済みのリソースを自動的に除去する
+ マルチクラスターのインフラストラクチャ管理にハブアンドスポークパターンを検討する

GitOps は、監査証跡、ロールバック機能、および宣言型のインフラストラクチャ管理を備えています。Argo CD の詳細については、「[Argo CD の使用](working-with-argocd.md)」を参照してください。

### kro によるリソース構成
<a name="_resource_composition_with_kro"></a>

EKS Capability for kro (Kube Resource Orchestrator) を使用すると、複数の ACK リソースを高次の抽象化とカスタム API に構成できます。

 **どのような場合に ACK で kro を使用するか**:
+ よく見られるインフラストラクチャスタック用に再利用可能なパターンを作成する場合 (データベース \$1 バックアップ \$1 モニタリング)
+ アプリケーションチーム向けに API をシンプルにしてセルフサービスプラットフォームを構築する場合
+ リソースの依存関係を管理し、リソース間で値を渡す (S3 バケット ARN を Lambda 関数に渡す) 場合
+ チーム間でインフラストラクチャ設定を標準化する場合
+ カスタムリソースの背後に実装の詳細を隠して複雑さを軽減する場合

 **パターンの例**:
+ アプリケーションスタック: S3 バケット \$1 SQS キュー \$1 通知設定
+ データベースセットアップ: RDS インスタンス \$1 パラメータグループ \$1 セキュリティグループ \$1 シークレット
+ ネットワーク: VPC \$1 サブネット \$1 ルートテーブル \$1 セキュリティグループ

kro は、構成済みのリソースに対して依存関係の順序付け、ステータスの伝播、ライフサイクルの管理を行います。kro の詳細については、「[kro の概念](kro-concepts.md)」を参照してください。

## リソースを整理する
<a name="_organizing_your_resources"></a>

Kubernetes 名前空間と AWS リソースタグを使用して ACK リソースを整理すると、管理、アクセスコントロール、コスト追跡を改善できます。

### 名前空間の整理
<a name="_namespace_organization"></a>

Kubernetes 名前空間を使用すると、環境 (本番稼働、ステージング、開発)、チーム (プラットフォーム、データ、ml)、またはアプリケーション別に ACK リソースを論理的に分離できます。

 **利点:**
+ アクセスコントロール用に RBAC を名前空間範囲で限定する
+ 注釈を使用して名前空間ごとにデフォルトリージョンを設定する
+ リソース管理とクリーンアップが容易になる
+ 組織構造に沿って論理的に分離できる

### リソースのタグ付け
<a name="_resource_tagging"></a>

EKS ACK 機能は、作成するすべての AWS リソースにデフォルトのタグを自動的に適用します。これらのタグはセルフマネージド ACK とは異なり、トレーサビリティが強化されています。

 **この機能によって適用されるデフォルトのタグ**:


| タグキー | 説明 | 
| --- | --- | 
|   `eks:controller-version`   |  ACK コントローラーのバージョン  | 
|   `eks:kubernetes-namespace`   |  ACK リソースの Kubernetes 名前空間  | 
|   `eks:kubernetes-resource-name`   |  Kubernetes リソースの名前  | 
|   `eks:kubernetes-api-group`   |  Kubernetes API グループ (例: `s3.services.k8s.aws`)  | 
|   `eks:eks-capability-arn`   |  EKS ACK 機能の ARN  | 

**注記**  
セルフマネージド ACK は、`services.k8s.aws/controller-version` や `services.k8s.aws/namespace` といった異なるデフォルトタグを使用します。この機能のタグは、他の EKS 機能との一貫性を保つために `eks:` プレフィックスを使用します。

 **その他の推奨タグ**:

コスト配分、所有権追跡、および整理目的でカスタムタグを追加します。
+ 環境 (本番稼働、ステージング、開発)
+ チームまたは部門の所有権
+ 請求を配分するためのコストセンター
+ アプリケーション名やサービス名

## 他の Infrastructure as Code ツールからの移行
<a name="_migration_from_other_infrastructure_as_code_tools"></a>

多くの組織が、Kubernetes を土台にワークロードのオーケストレーションを超えた標準化を図ることに価値を見出しています。インフラストラクチャと AWS リソースの管理を ACK に移行することで、アプリケーションワークロードと共に Kubernetes API を使用してインフラストラクチャ管理を標準化できます。

 **Kubernetes を土台にインフラストラクチャを標準化するメリット**:
+  **信頼できる単一のソース**: Kubernetes でアプリケーションとインフラストラクチャの両方を管理して、エンドツーエンドの GitOps プラクティスを実現する
+  **統一されたツール**: チームは Kubernetes のリソースとツールを使用すればよく、いくつものツールやフレームワークを学習する必要がない
+  **一貫性のある調整**: ACK は、Kubernetes がワークロードに対してそうであるように、AWS リソースを継続的に調整し、必須のツールと比較してドリフトを検出して修正する
+  **ネイティブコンポジション**: kro と ACK を一緒に使用して、アプリケーションとリソースのマニフェストで AWS リソースを直接参照し、リソース間で接続文字列と ARN を渡す
+  **シンプルなオペレーション**: 1 つのコントロールプレーンでシステム全体のデプロイ、ロールバック、オブザーバビリティを実現する

ACK は、AWS リソースを再作成せずに既存のものを採用するため、CloudFormation、Terraform、またはクラスター外のリソースからダウンタイムなしで移行できます。

 **既存のリソースを採用する**:

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: existing-bucket
  annotations:
    services.k8s.aws/adoption-policy: "adopt-or-create"
spec:
  name: my-existing-bucket-name
```

採用されたリソースは、ACK によって管理され、Kubernetes マニフェストを介して更新できます。段階的に移行できるため、必要に応じてリソースを採用しながら、他のリソースでは既存の IaC ツールを維持できます。

また、ACK は読み取り専用リソースもサポートしています。他のチームやツールで管理されるリソースを変更するのではなく参照するだけにする場合は、採用と `retain` 削除ポリシーとを組み合わせて、読み取り IAM アクセス許可のみを付与します。これにより、アプリケーションは変更のリスクを冒すことなく Kubernetes API を介して共有インフラストラクチャ (VPC、IAM ロール、KMS キー) を検出できます。

リソースの採用の詳細については、「[ACK の概念](ack-concepts.md)」を参照してください。

## 削除ポリシー
<a name="_deletion_policies"></a>

削除ポリシーは、対応する Kubernetes リソースを削除したときに AWS リソースがどうなるかを制御します。リソースのライフサイクルと実際の運用要件に基づいて、適切なポリシーを選択します。

### 削除する (デフォルト)
<a name="_delete_default"></a>

Kubernetes リソースを削除すると、AWS リソースも削除されます。そのため、クラスターと AWS との一貫性が維持され、リソースの蓄積を防ぐことができます。

 **どのような場合に削除を使用するか**:
+ 開発環境とテスト環境でクリーンアップが重要な場合
+ エフェメラルリソースがアプリケーションのライフサイクルに結びついている場合 (テストデータベースや一時バケット)
+ リソースがアプリケーションよりも長く存続してはいけない場合 (SQS キューや ElastiCache クラスター)
+ コスト最適化 - 未使用のリソースを自動的にクリーンアップする場合
+ GitOps で管理された環境で、Git からリソースが削除されたらインフラストラクチャも削除される場合

Kubernetes の宣言型モデルに合わせてデフォルトの削除ポリシーを調整します。クラスターの内容は AWS に存在するものと一致します。

### Retain
<a name="_retain"></a>

Kubernetes リソースを削除しても、AWS リソースは保持されます。これにより、重要なデータが保護され、リソースは Kubernetes 表現よりも長く存続できます。

 **どのような場合に保持を使用するか**:
+ 本番稼働用データベースにクラスターの変更後も存続する必要がある重要なデータが保存されている場合
+ 長期ストレージバケットにコンプライアンス要件や監査要件がある場合
+ 複数のアプリケーションやチームが共有リソースを使用している場合
+ さまざまな管理ツールにリソースを移行する場合
+ ディザスタリカバリでインフラストラクチャを維持する場合
+ 廃止に慎重を要する複雑な依存関係がリソースにある場合

```
apiVersion: rds.services.k8s.aws/v1alpha1
kind: DBInstance
metadata:
  name: production-db
  annotations:
    services.k8s.aws/deletion-policy: "retain"
spec:
  dbInstanceIdentifier: prod-db
  # ... configuration
```

**重要**  
保持したリソースは、引き続き AWS コストが発生するため、不要になったら AWS から手動で削除する必要があります。リソースのタグ付けを使用すると、保持したリソースの中にクリーンアップが必要なものがないかを追跡できます。

削除ポリシーの詳細については、「[ACK の概念](ack-concepts.md)」を参照してください。

## アップストリームドキュメント
<a name="_upstream_documentation"></a>

ACK の使用の詳細については、以下を参照してください。
+  [ACK 使用ガイド](https://aws-controllers-k8s.github.io/community/docs/user-docs/usage/) - リソースの作成および管理
+  [ACK API リファレンス](https://aws-controllers-k8s.github.io/community/reference/) - すべてのサービスの詳細な API ドキュメント
+  [ACK ドキュメント](https://aws-controllers-k8s.github.io/community/docs/) - ユーザー向けの包括的なドキュメント

## 次のステップ
<a name="_next_steps"></a>
+  [ACK アクセス許可を設定する](ack-permissions.md) - IAM アクセス許可およびマルチアカウントパターンを設定する
+  [ACK の概念](ack-concepts.md) - ACK の概念およびリソースライフサイクルを理解する
+  [ACK 機能に関する問題をトラブルシューティングする](ack-troubleshooting.md) - ACK の問題をトラブルシューティングする
+  [Argo CD の使用](working-with-argocd.md) - GitOps で ACK リソースをデプロイする
+  [kro の概念](kro-concepts.md) - ACK リソースを高次の抽象化に構成する

# ACK 機能に関する問題をトラブルシューティングする
<a name="ack-troubleshooting"></a>

このトピックでは、機能のヘルスチェック、リソースステータスの確認、IAM アクセス許可の問題など、EKS Capability for ACK をトラブルシューティングする際のガイダンスを示します。

**注記**  
EKS の機能は完全に管理され、クラスターの外部で実行されます。コントローラーのログや名前空間にアクセスすることはできません。トラブルシューティングでは、機能のヘルス、リソースのステータス、IAM の設定に焦点を当てています。

## 機能がアクティブなのにリソースが作成されない
<a name="_capability_is_active_but_resources_arent_being_created"></a>

ACK 機能のステータスが `ACTIVE` なのに AWS にリソースが作成されない場合は、機能のヘルス、リソースのステータス、IAM アクセス許可を確認してください。

 **機能のヘルスを確認する**:

機能のヘルスとステータスの問題は、EKS コンソールまたは AWS CLI を使用して表示できます。

 **コンソール:**

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択します。

1. **[オブザーバビリティ]** タブを選択します。

1. **[クラスターを監視する]** を選択します。

1. **[機能]** タブを選択すると、すべての機能のヘルスとステータスが表示されます。

 **AWS CLI**:

```
# View capability status and health
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-ack

# Look for issues in the health section
```

 **一般的な原因:**
+  **IAM アクセス許可がない**: 機能ロールに AWS サービスのアクセス許可が付与されていません。
+  **名前空間が間違っている: **IAMRoleSelector が適切でない名前空間にリソースが作成されました。
+  **リソース仕様が無効である**: リソースのステータス条件に検証エラーがないか確認してください。
+  **API スロットリング**: AWS API レートリミットに達しています。
+  **アドミッションウェブフック**: アドミッションウェブフックのために、コントローラーがリソースステータスにパッチを適用できません。

 **リソースのステータスを確認する**:

```
# Describe the resource to see conditions and events
kubectl describe bucket my-bucket -n default

# Look for status conditions
kubectl get bucket my-bucket -n default -o jsonpath='{.status.conditions}'

# View resource events
kubectl get events --field-selector involvedObject.name=my-bucket -n default
```

 **IAM アクセス許可を確認する**:

```
# View the Capability Role's policies
aws iam list-attached-role-policies --role-name my-ack-capability-role
aws iam list-role-policies --role-name my-ack-capability-role

# Get specific policy details
aws iam get-role-policy --role-name my-ack-capability-role --policy-name policy-name
```

## AWS にリソースが作成されているのに Kubernetes に表示されない
<a name="resources_created_in_shared_aws_but_not_showing_in_kubernetes"></a>

ACK で追跡できるリソースは、Kubernetes マニフェストを介して作成されたものだけです。ACK で既存の AWS リソースを管理するには、採用機能を使用します。

```
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: existing-bucket
  annotations:
    services.k8s.aws/adoption-policy: "adopt-or-create"
spec:
  name: my-existing-bucket-name
```

リソースの採用の詳細については、「[ACK の概念](ack-concepts.md)」を参照してください。

## クロスアカウントリソースが作成されない
<a name="_cross_account_resources_not_being_created"></a>

IAM ロールセレクターの使用時にターゲット AWS アカウントにリソースが作成されない場合は、信頼関係と IAMRoleSelector 設定を確認します。

 **信頼関係を確認する**:

```
# Check the trust policy in the target account role
aws iam get-role --role-name cross-account-ack-role --query 'Role.AssumeRolePolicyDocument'
```

信頼ポリシーは、ソースアカウントの機能ロールに引き受けられるようになっている必要があります。

 **IAMRoleSelector 設定を確認する**:

```
# List IAMRoleSelectors (cluster-scoped)
kubectl get iamroleselector

# Describe specific selector
kubectl describe iamroleselector my-selector
```

 **名前空間の配置を確認する**:

IAMRoleSelectors は、クラスター範囲のリソースですが、特定の名前空間をターゲットとします。ACK リソースが IAMRoleSelector の名前空間セレクターに一致する名前空間にあることを確認してください。

```
# Check resource namespace
kubectl get bucket my-cross-account-bucket -n production

# List all IAMRoleSelectors (cluster-scoped)
kubectl get iamroleselector

# Check which namespace the selector targets
kubectl get iamroleselector my-selector -o jsonpath='{.spec.namespaceSelector}'
```

 **IAMRoleSelected 条件を確認する**:

`ACK.IAMRoleSelected` 条件を調べて、IAMRoleSelector がリソースに正常に一致したものであることを確認します。

```
# Check if IAMRoleSelector was matched
kubectl get bucket my-cross-account-bucket -n production -o jsonpath='{.status.conditions[?(@.type=="ACK.IAMRoleSelected")]}'
```

条件が `False` であるか指定されていない場合は、IAMRoleSelector の名前空間セレクターがリソースの名前空間と一致しません。セレクターの `namespaceSelector` がリソースの名前空間ラベルと一致していることを確認します。

 **機能ロールのアクセス許可を確認する**:

機能ロールには、ターゲットアカウントロールの `sts:AssumeRole` および `sts:TagSession` のアクセス許可が必要です。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["sts:AssumeRole", "sts:TagSession"],
      "Resource": "arn:aws:iam::[.replaceable]`444455556666`:role/[.replaceable]`cross-account-ack-role`"
    }
  ]
}
```

クロスアカウント設定の詳細については、「[ACK アクセス許可を設定する](ack-permissions.md)」を参照してください。

## 次のステップ
<a name="_next_steps"></a>
+  [EKS を利用する場合の ACK の考慮事項](ack-considerations.md) - ACK の考慮事項とベストプラクティス
+  [ACK アクセス許可を設定する](ack-permissions.md) - IAM アクセス許可およびマルチアカウントパターンを設定する
+  [ACK の概念](ack-concepts.md) - ACK の概念およびリソースライフサイクルを理解する
+  [EKS 機能をトラブルシューティングする](capabilities-troubleshooting.md) - 一般的な機能をトラブルシューティングする際のガイダンス

# EKS Capability for ACK とセルフマネージド ACK を比較する
<a name="ack-comparison"></a>

EKS Capability for ACK が提供する機能はセルフマネージド ACK コントローラーと同じですが、その操作性に大きなメリットがあります。EKS 機能とセルフマネージドソリューションの全般的な比較については、「[EKS 機能と考慮事項](capabilities-considerations.md)」を参照してください。このトピックでは、ACK に固有の違いに焦点を当てます。

## アップストリーム ACK との違い
<a name="_differences_from_upstream_ack"></a>

EKS Capability for ACK は、アップストリーム ACK コントローラーに基づいていますが、IAM との統合に違いがあります。

 **IAM 機能ロール**: この機能は、信頼ポリシーが付与された専用の IAM ロールを使用して `capabilities.eks.amazonaws.com` サービスプリンシパルを許可します。IRSA (サービスアカウントの IAM ロール) は使用しません。IAM ポリシーを直接アタッチできるため、Kubernetes サービスアカウントを作成して注釈を付ける必要も、OIDC プロバイダーを設定する必要もありません。本番稼働のユースケースでは、`IAMRoleSelector` を使用してサービスアクセス許可を設定するのがベストプラクティスです。詳細については、「[ACK アクセス許可を設定する](ack-permissions.md)」を参照してください。

 **セッションタグ**: マネージド機能は、すべての AWS API リクエストにセッションタグを自動的に設定し、きめ細かなアクセスコントロールと監査を可能にします。タグには、`eks:eks-capability-arn`、`eks:kubernetes-namespace`、および `eks:kubernetes-api-group` が含まれます。これは、これらのタグをデフォルトで設定しないセルフマネージド ACK とは異なります。IAM ポリシーでのセッションタグの使用の詳細については、「[ACK アクセス許可を設定する](ack-permissions.md)」を参照してください。

 **リソースタグ**: この機能は、セルフマネージド ACK とは異なるデフォルトタグを AWS リソースに適用します。この機能では、セルフマネージド ACK で使用される `services.k8s.aws/` タグの代わりに `eks:` プレフィックス付きタグ (`eks:kubernetes-namespace`、`eks:eks-capability-arn` など) を使用します。デフォルトのリソースタグの完全なリストについては、「[EKS を利用する場合の ACK の考慮事項](ack-considerations.md)」を参照してください。

 **リソースの互換性**: ACK カスタムリソースは、アップストリーム ACK と同じように動作するため、ACK リソース YAML ファイルを変更する必要はありません。この機能は同じ Kubernetes API と CRD を使用するため、`kubectl` のようなツールは同じように機能します。アップストリーム ACK のすべての GA コントローラーおよびリソースがサポートされています。

ACK ドキュメントとサービス固有の詳細なガイドについては、[ACK ドキュメント](https://aws-controllers-k8s.github.io/community/)を参照してください。

## 移行パス
<a name="_migration_path"></a>

セルフマネージド ACK からマネージド機能にダウンタイムなしで移行できます。

1. リーダー選出リースに `kube-system` を使用するようにセルフマネージド ACK コントローラーを更新します。次に例を示します。

   ```
   helm upgrade --install ack-s3-controller \
     oci://public.ecr.aws/aws-controllers-k8s/s3-chart \
     --namespace ack-system \
     --set leaderElection.namespace=kube-system
   ```

   これにより、コントローラーのリースが `kube-system` に移動するため、マネージド機能がコントローラーを調整できるようになります。

1. クラスターに ACK 機能を作成します (「[ACK 機能を作成する](create-ack-capability.md)」を参照)。

1. マネージド機能が既存の ACK マネージド AWS リソースを認識して、調整を引き継ぎます。

1. セルフマネージドコントローラーのデプロイを段階的にスケールダウンするか、削除します。

   ```
   helm uninstall ack-s3-controller --namespace ack-system
   ```

このアプローチにより、移行中、両方のコントローラーを安全に共存させることができます。マネージド機能がこれまでセルフマネージドコントローラーで管理されていたリソースを自動的に採用するため、引き続き競合なく調整を図ることができます。

## 次のステップ
<a name="_next_steps"></a>
+  [ACK 機能を作成する](create-ack-capability.md) - ACK の機能リソースを作成する
+  [ACK の概念](ack-concepts.md) - ACK の概念およびリソースライフサイクルを理解する
+  [ACK アクセス許可を設定する](ack-permissions.md) - IAM およびアクセス許可を設定する

# Argo CD による継続的デプロイ
<a name="argocd"></a>

Argo CD は、Kubernetes 向けの宣言型 GitOps 継続的デリバリーツールです。Argo CD を使用すると、複数のクラスターと環境にわたるアプリケーションのデプロイとライフサイクルを自動的に管理できます。Argo CD は、Git リポジトリ、Helm レジストリ (HTTP および OCI)、OCI イメージなど複数のソースタイプをサポートしており、セキュリティとコンプライアンスの要件がさまざまに異なる組織に柔軟に対応できます。

AWS では EKS の機能を使用して Argo CD を完全に管理できるため、クラスターに Argo CD コントローラーとその依存関係をインストールしてメンテナンスおよびスケールする必要がありません。

## Argo CD の仕組み
<a name="_how_argo_cd_works"></a>

Argo CD は GitOps パターンに従い、アプリケーションソース (Git リポジトリ、Helm レジストリ、または OCI イメージ) を、目的のアプリケーション状態を定義するための信頼できるソースとします。Argo CD `Application` リソースを作成するときは、アプリケーションマニフェストが含まれているソースと、ターゲットとなる Kubernetes クラスターおよび名前空間を指定します。Argo CD は、クラスター内のソース状態とライブ状態の両方を継続的にモニタリングし、変更が加えられたら自動的に同期して、クラスターの状態が目的の状態と一致するようにします。

**注記**  
EKS Capability for Argo CD では、Argo CD ソフトウェアはワーカーノードではなく AWS コントロールプレーンで動作します。つまり、ワーカーノードが Git リポジトリや Helm レジストリに直接アクセスする必要はありません。この機能は、AWS アカウントからのソースアクセスを処理します。

Argo CD には、主に 3 つのリソースタイプがあります。
+  **Application**: Git リポジトリからターゲットクラスターへのデプロイを定義します。
+  **ApplicationSet**: 複数のクラスターにデプロイできるように、テンプレートから複数の Application を生成します
+  **AppProject**: Application を論理的にグループ化し、アクセスコントロールを付与できます。

 **例: Argo CD Application を作成する** 

次の例は、Argo CD `Application` リソースを作成する方法を示しています。

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    targetRevision: HEAD
    path: guestbook
  destination:
    name: in-cluster
    namespace: guestbook
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
```

**注記**  
クラスターの登録時に使用したクラスター名で `destination.name` を使用します (ローカルクラスターの `in-cluster` の場合など)。`destination.server` フィールドは EKS クラスター ARN でも機能しますが、読みやすくするためにクラスター名を使用することをお勧めします。

## Argo CD のメリット
<a name="_benefits_of_argo_cd"></a>

GitOps ワークフローを実装しているため、Git リポジトリにアプリケーション設定を定義できます。また、目的の状態に合わせてアプリケーションを自動的に同期する機能も備えています。この Git 中心のアプローチにより、すべての変更が漏れなく監査証跡に残され、ロールバックが容易になり、既存のコードレビューおよび承認プロセスと必然的に統合されます。Argo CD は、Git の目的の状態とクラスターの実際の状態との間のドリフトを自動的に検出して調整し、デプロイと宣言された設定との整合性が確保されるようにします。

Argo CD を使用すると、単一の Argo CD インスタンスから複数のクラスターにアプリケーションをデプロイして管理できるため、マルチクラスター環境とマルチリージョン環境でのオペレーションがシンプルになります。Argo CD UI に可視化とモニタリングの機能が用意されているため、アプリケーションのデプロイステータス、ヘルス、履歴を確認できます。この UI は AWS アイデンティティセンター (以前の AWS SSO) と統合されており、認証と認可をシームレスに進めて、既存の ID 管理インフラストラクチャを使用してアクセスを制御できます。

AWS では、Argo CD が EKS マネージド機能の一部として完全に管理されるため、Argo CD インフラストラクチャを導入、設定、メンテナンスする必要がありません。AWS がスケール、パッチ適用、運用管理を行うので、チームはツールのメンテナンスではなくアプリケーションの配信に集中できます。

## AWS アイデンティティセンターとの統合
<a name="integration_with_shared_aws_identity_center"></a>

EKS マネージド機能により、Argo CD と AWS アイデンティティセンターを直接統合して、ユーザーの認証と認可をシームレスに進めることができます。Argo CD 機能を有効にすると、アイデンティティセンターのグループとユーザーを Argo CD RBAC ロールにマッピングするように AWS アイデンティティセンターの統合を設定して、Argo CD で誰がアプリケーションにアクセスおよび管理できるかを制御できます。

## 他の EKS マネージド機能との統合
<a name="_integration_with_other_eks_managed_capabilities"></a>

Argo CD は、他の EKS マネージド機能と統合されています。
+  **Kubernetes 用 AWS コントローラー (ACK)**: Argo CD を使用すると、複数のクラスターにまたがる ACK リソースのデプロイを管理して、AWS インフラストラクチャの GitOps ワークフローを有効にできます。
+  **kro (Kube Resource Orchestrator)**: Argo CD を使用すると、複数のクラスターに kro コンポジションをデプロイして、Kubernetes エステート全体で一貫性のあるリソース構成を実現できます。

## Argo CD の使用を開始する
<a name="_getting_started_with_argo_cd"></a>

EKS Capability for Argo CD の使用を開始するには:

1. IAM 機能ロールを作成し、Argo CD がソースにアクセスしてアプリケーションを管理できるように必要なアクセス許可を設定します。

1.  AWS コンソール、AWS CLI、または任意の Infrastructure as Code ツールを使用して、EKS クラスターに [Argo CD 機能リソースを作成](create-argocd-capability.md)します。

1. アプリケーションをデプロイするために、リポジトリアクセスを設定し、クラスターを登録します。

1. Application リソースを作成して、宣言型ソースからアプリケーションをデプロイします。

# Argo CD 機能を作成する
<a name="create-argocd-capability"></a>

このトピックでは、Amazon EKS クラスターに Argo CD 機能を作成する方法について説明します。

## 前提条件
<a name="_prerequisites"></a>

Argo CD 機能を作成する前に、以下の点を確認してください。
+ サポート対象の Kubernetes バージョン (標準サポートと延長サポートのすべてのバージョンがサポート対象) を実行している Amazon EKS クラスターが存在する
+  **AWS アイデンティティセンターが設定されている** - Argo CD の認証に必要 (ローカルユーザーはサポート対象外)
+ Argo CD に対するアクセス許可が付与された IAM 機能ロールがある
+ EKS クラスターに機能リソースを作成するための十分な IAM アクセス許可がある
+  クラスターと通信できるように `kubectl` が設定されていること
+ (オプション) Argo CD CLI をインストールしてクラスターとリポジトリの管理を容易にしている
+ (CLI/eksctl の場合) 適切な CLI ツールがインストールおよび設定されている

IAM 機能ロールを作成する手順については、「[Amazon EKS 機能 IAM ロール](capability-role.md)」を参照してください。アイデンティティセンターのセットアップについては、「[AWS アイデンティティセンターの使用を開始する](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)」を参照してください。

**重要**  
Argo CD でどの AWS リソースにアクセスできるかは、どの IAM 機能ロールを使用するかによって決まります。例えば、Git リポジトリへのアクセスには CodeConnections を利用し、シークレットへのアクセスには Secrets Manager を使用します。最小特権のアクセス許可を付与した適切なロールを作成する際のガイダンスについては、「[Amazon EKS 機能 IAM ロール](capability-role.md)」および「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

## ツールを選択する
<a name="_choose_your_tool"></a>

AWS マネジメントコンソール、AWS CLI、または eksctl を使用して、Argo CD 機能を作成できます。
+  [コンソールを使用して Argo CD 機能を作成する](argocd-create-console.md) - 指示に従って操作する場合はコンソールを使用します。
+  [AWS CLI を使用して Argo CD 機能を作成する](argocd-create-cli.md) - スクリプトを作成して自動化を図る場合は AWS CLI を使用します。
+  [eksctl を使用して Argo CD 機能を作成する](argocd-create-eksctl.md) - Kubernetes ネイティブの操作をする場合は eksctl を使用します。

## Argo CD 機能を作成するとどうなるか
<a name="_what_happens_when_you_create_an_argo_cd_capability"></a>

Argo CD 機能を作成すると、次のようになります。

1. EKS が AWS コントロールプレーンに Argo CD 機能サービスを作成します。

1. カスタムリソース定義 (CRD) がクラスターにインストールされます。

1. Kubernetes のベースラインアクセス許可を付与する機能固有のアクセスエントリポリシーを使用して、IAM 機能ロールのアクセスエントリを自動的に作成します (「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照)。

1. Argo CD がカスタムリソース (Application、ApplicationSet、AppProject) の監視を開始します。

1. 機能のステータスが `CREATING` から `ACTIVE` に変わります。

1. Argo CD UI が URL 経由でアクセス可能になります。

機能がアクティブになったら、宣言型ソースからデプロイするようにクラスターに Argo CD Application を作成できます。

**注記**  
自動的に作成されるアクセスエントリは、アプリケーションをクラスターにデプロイするアクセス許可を付与しません。アプリケーションをデプロイするには、ターゲットクラスターごとに追加の Kubernetes RBAC アクセス許可を設定する必要があります。クラスターの登録とアクセスの設定の詳細については、「[ターゲットクラスターを登録する](argocd-register-clusters.md)」を参照してください。

## 次のステップ
<a name="_next_steps"></a>

Argo CD 機能の作成後:
+  [Argo CD の概念](argocd-concepts.md) - GitOps の原則、同期ポリシー、マルチクラスターパターンについて学ぶ
+  [Argo CD の使用](working-with-argocd.md) - リポジトリアクセスを設定し、ターゲットクラスターを登録して、Application を作成する
+  [Argo CD に関する考慮事項](argocd-considerations.md) - マルチクラスターアーキテクチャパターンと高度な設定を探る

# コンソールを使用して Argo CD 機能を作成する
<a name="argocd-create-console"></a>

このトピックでは、AWS マネジメントコンソール を使用して Argo CD 機能を作成する方法について説明します。

## 前提条件
<a name="_prerequisites"></a>
+  **AWS アイデンティティセンターが設定されていること** – Argo CD での認証には AWS アイデンティティセンターが必要です。ローカルユーザーはサポートされていません。AWS アイデンティティセンターをセットアップしていない場合は、「[AWS アイデンティティセンターの使用を開始する](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)」を参照してアイデンティティセンターインスタンスを作成し、「[ユーザーを追加する](https://docs.aws.amazon.com/singlesignon/latest/userguide/addusers.html)」と「[グループを追加する](https://docs.aws.amazon.com/singlesignon/latest/userguide/addgroups.html)」を参照して Argo CD へのアクセスに必要なユーザーとグループを作成します。

## Argo CD 機能を作成する
<a name="_create_the_argo_cd_capability"></a>

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択して、クラスターの詳細ページを開きます。

1. **[機能]** タブを選択します。

1. 左のナビゲーションで、**[Argo CD]** を選択します。

1. **[Argo CD 機能を作成]** を選択します。

1. **IAM 機能ロール**に対して以下の操作を行います。
   + IAM 機能ロールが既に存在する場合は、ドロップダウンから選択します。
   + ロールを作成する必要がある場合は、**[Argo CD ロールを作成]** を選択します。

     IAM コンソールが新しいタブに開かれます。信頼ポリシーには値があらかじめ入力され、Secrets Manager にはフル読み取りアクセスが付与されています。デフォルトでは他にアクセス許可は追加されませんが、必要に応じて追加することもできます。CodeCommit リポジトリや他の AWS サービスを使用する場合は、ロールを作成する前に適切なアクセス許可を追加します。

     ロールを作成して EKS コンソールに戻ると、そのロールが自動的に選択されます。
**注記**  
AWS Secrets Manager または AWS CodeConnections とをオプションで統合する場合は、ロールにアクセス許可を追加する必要があります。IAM ポリシーの例と設定ガイダンスについては、「[AWS Secrets Manager を使用してアプリケーションシークレットを管理する](integration-secrets-manager.md)」および「[AWS CodeConnections を使用して Git リポジトリに接続する](integration-codeconnections.md)」を参照してください。

1. AWS アイデンティティセンターの統合を設定します。

   1. **[AWS アイデンティティセンターの統合を有効にする]** を選択します。

   1. ドロップダウンからアイデンティティセンターインスタンスを選択します。

   1. ユーザーまたはグループを Argo CD ロール (ADMIN、EDITOR、または VIEWER) に割り当てて、RBAC 用にロールマッピングを設定します。

1. **[作成]** を選択します。

機能作成プロセスが始まります。

## 機能がアクティブであることを確認する
<a name="_verify_the_capability_is_active"></a>

1. **[機能]** タブで、Argo CD 機能のステータスを表示します。

1. ステータスが `CREATING` から `ACTIVE` に変わるまで待ちます。

1. アクティブになったら、この機能を使用する準備は完了です。

機能のステータスとトラブルシューティングの詳細については、「[機能リソースの使用](working-with-capabilities.md)」を参照してください。

## Argo CD UI にアクセスする
<a name="_access_the_argo_cd_ui"></a>

機能がアクティブになったら、以下の手順で Argo CD UI にアクセスできます。

1. Argo CD 機能のページで、**[Argo CD UI を開く]** を選択します。

1. Argo CD UI がブラウザの新しいタブに開かれます。

1. アプリケーションの作成とデプロイの管理を UI から行えるようになりました。

## 次のステップ
<a name="_next_steps"></a>
+  [Argo CD の使用](working-with-argocd.md) - リポジトリを設定し、クラスターを登録し、Application を作成する
+  [Argo CD に関する考慮事項](argocd-considerations.md) - マルチクラスターアーキテクチャと高度な設定
+  [機能リソースの使用](working-with-capabilities.md) - Argo CD 機能リソースを管理する

# AWS CLI を使用して Argo CD 機能を作成する
<a name="argocd-create-cli"></a>

このトピックでは、AWS CLI を使用して Argo CD 機能を作成する方法について説明します。

## 前提条件
<a name="_prerequisites"></a>
+  **AWS CLI** バージョン `2.12.3` 以降。バージョンを確認するには、`aws --version` を実行します。詳細についてはAWS コマンドラインインターフェイスユーザーガイドの「[インストール](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)」を参照してください。
+  **`kubectl`** - Kubernetes クラスターを操作するためのコマンドラインツール。詳細については、「[`kubectl` および `eksctl` のセットアップ](install-kubectl.md)」を参照してください。
+  **AWS アイデンティティセンターが設定されていること** – Argo CD での認証には AWS アイデンティティセンターが必要です。ローカルユーザーはサポートされていません。AWS アイデンティティセンターをセットアップしていない場合は、「[AWS アイデンティティセンターの使用を開始する](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)」を参照してアイデンティティセンターインスタンスを作成し、「[ユーザーを追加する](https://docs.aws.amazon.com/singlesignon/latest/userguide/addusers.html)」と「[グループを追加する](https://docs.aws.amazon.com/singlesignon/latest/userguide/addgroups.html)」を参照して Argo CD へのアクセスに必要なユーザーとグループを作成します。

## ステップ 1: IAM 機能ロールを作成する
<a name="_step_1_create_an_iam_capability_role"></a>

信頼ポリシーファイルを作成します。

```
cat > argocd-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

IAM ロールを作成します。

```
aws iam create-role \
  --role-name ArgoCDCapabilityRole \
  --assume-role-policy-document file://argocd-trust-policy.json
```

**注記**  
AWS Secrets Manager または AWS CodeConnections とをオプションで統合する場合は、ロールにアクセス許可を追加する必要があります。IAM ポリシーの例と設定ガイダンスについては、「[AWS Secrets Manager を使用してアプリケーションシークレットを管理する](integration-secrets-manager.md)」および「[AWS CodeConnections を使用して Git リポジトリに接続する](integration-codeconnections.md)」を参照してください。

## ステップ 2: Argo CD 機能を作成する
<a name="_step_2_create_the_argo_cd_capability"></a>

クラスターに Argo CD 機能リソースを作成します。

まず、アイデンティティセンターを設定するための環境変数を設定します。

```
# Get your Identity Center instance ARN (replace region if your IDC instance is in a different region)
export IDC_INSTANCE_ARN=$(aws sso-admin list-instances --region [.replaceable]`region` --query 'Instances[0].InstanceArn' --output text)

# Get a user ID for RBAC mapping (replace with your username and region if needed)
export IDC_USER_ID=$(aws identitystore list-users \
  --region [.replaceable]`region` \
  --identity-store-id $(aws sso-admin list-instances --region [.replaceable]`region` --query 'Instances[0].IdentityStoreId' --output text) \
  --query 'Users[?UserName==`your-username`].UserId' --output text)

echo "IDC_INSTANCE_ARN=$IDC_INSTANCE_ARN"
echo "IDC_USER_ID=$IDC_USER_ID"
```

アイデンティティセンター統合で機能を作成します。*region-code* をクラスターがある AWS リージョンに、*my-cluster* をクラスター名に、*idc-region-code* をお使いの IAM アイデンティティセンターが設定されているリージョンコードに置き換えます。

```
aws eks create-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-argocd \
  --type ARGOCD \
  --role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/ArgoCDCapabilityRole \
  --delete-propagation-policy RETAIN \
  --configuration '{
    "argoCd": {
      "awsIdc": {
        "idcInstanceArn": "'$IDC_INSTANCE_ARN'",
        "idcRegion": "'[.replaceable]`idc-region-code`'"
      },
      "rbacRoleMappings": [{
        "role": "ADMIN",
        "identities": [{
          "id": "'$IDC_USER_ID'",
          "type": "SSO_USER"
        }]
      }]
    }
  }'
```

このコマンドはすぐに戻りますが、EKS が必要な機能インフラストラクチャとコンポーネントを作成するため、機能がアクティブになるまでにはしばらく時間がかかります。EKS は、この機能に関連する Kubernetes カスタムリソース定義をその作成時にクラスターにインストールします。

**注記**  
クラスターが存在しないというエラーやアクセス許可がないというエラーが表示された場合は、以下の点を確認します。  
クラスター名が正しいこと
AWS CLI が正しいリージョンに設定されていること
必要な IAM アクセス許可を追加したこと

## ステップ 3: 機能がアクティブであることを確認する
<a name="_step_3_verify_the_capability_is_active"></a>

機能がアクティブになるまで待機します。*region-code* はクラスターが配置された AWS リージョンに置き換え、*my-cluster* はクラスターの名前に置き換えます。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-argocd \
  --query 'capability.status' \
  --output text
```

ステータスが `ACTIVE` と表示されたら、機能の準備は完了です。ステータスが `ACTIVE` になるまで、次のステップに進まないでください。

機能の詳細全体を表示することもできます。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-argocd
```

## ステップ 4: カスタムリソースが使用可能であることを確認する
<a name="_step_4_verify_custom_resources_are_available"></a>

機能がアクティブになったら、Argo CD カスタムリソースがクラスターで使用可能になっていることを確認します。

```
kubectl api-resources | grep argoproj.io
```

`Application` と `ApplicationSet` のリソースタイプがリストされます。

## 次のステップ
<a name="_next_steps"></a>
+  [Argo CD の使用](working-with-argocd.md) - リポジトリを設定し、クラスターを登録し、Application を作成する
+  [Argo CD に関する考慮事項](argocd-considerations.md) - マルチクラスターアーキテクチャと高度な設定
+  [機能リソースの使用](working-with-capabilities.md) - Argo CD 機能リソースを管理する

# eksctl を使用して Argo CD 機能を作成する
<a name="argocd-create-eksctl"></a>

このトピックでは、eksctl で Argo CD 機能を作成する方法について説明します。

**注記**  
以下のステップを実行するには、eksctl バージョン `0.220.0` 以降が必要です。バージョンを確認するには、`eksctl version` を実行します。

## ステップ 1: IAM 機能ロールを作成する
<a name="_step_1_create_an_iam_capability_role"></a>

信頼ポリシーファイルを作成します。

```
cat > argocd-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

IAM ロールを作成します。

```
aws iam create-role \
  --role-name ArgoCDCapabilityRole \
  --assume-role-policy-document file://argocd-trust-policy.json
```

**注記**  
こうした基本的なセットアップの場合、追加の IAM ポリシーは必要ありません。リポジトリ認証情報や CodeConnections に Secrets Manager を使用する場合は、ロールにアクセス許可を追加する必要があります。IAM ポリシーの例と設定ガイダンスについては、「[AWS Secrets Manager を使用してアプリケーションシークレットを管理する](integration-secrets-manager.md)」および「[AWS CodeConnections を使用して Git リポジトリに接続する](integration-codeconnections.md)」を参照してください。

## ステップ 2: AWS アイデンティティセンター設定を取得する
<a name="step_2_get_your_shared_aws_identity_center_configuration"></a>

RBAC 設定用にアイデンティティセンターインスタンス ARN とユーザー ID を取得します。

```
# Get your Identity Center instance ARN
aws sso-admin list-instances --query 'Instances[0].InstanceArn' --output text

# Get a user ID for admin access (replace 'your-username' with your Identity Center username)
aws identitystore list-users \
  --identity-store-id $(aws sso-admin list-instances --query 'Instances[0].IdentityStoreId' --output text) \
  --query 'Users[?UserName==`your-username`].UserId' --output text
```

これらの値をメモしてください。次のステップで必要になります。

## ステップ 3: eksctl 設定ファイルを作成する
<a name="_step_3_create_an_eksctl_configuration_file"></a>

`argocd-capability.yaml` という名前のファイルを作成し、次の内容を記述します。各プレースホルダーの値をそれぞれクラスター名、クラスターのリージョン、IAM ロール ARN、アイデンティティセンターインスタンス ARN、アイデンティティセンターリージョン、およびユーザー ID に置き換えます。

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: my-cluster
  region: cluster-region-code

capabilities:
  - name: my-argocd
    type: ARGOCD
    roleArn: arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole
    deletePropagationPolicy: RETAIN
    configuration:
      argocd:
        awsIdc:
          idcInstanceArn: arn:aws:sso:::instance/ssoins-123abc
          idcRegion: idc-region-code
        rbacRoleMappings:
          - role: ADMIN
            identities:
              - id: 38414300-1041-708a-01af-5422d6091e34
                type: SSO_USER
```

**注記**  
RBAC マッピングに複数のユーザーまたはグループを追加できます。グループの場合、`type: SSO_GROUP` を使用してグループ ID を指定します。使用可能なロールは、`ADMIN`、`EDITOR`、および `VIEWER` です。

## ステップ 4: Argo CD 機能を作成する
<a name="_step_4_create_the_argo_cd_capability"></a>

設定ファイルを適用します。

```
eksctl create capability -f argocd-capability.yaml
```

このコマンドはすぐに戻りますが、機能がアクティブになるまでにはしばらく時間がかかります。

## ステップ 5: 機能がアクティブであることを確認する
<a name="_step_5_verify_the_capability_is_active"></a>

機能のステータスを確認します。*region-code* はクラスターがある AWS リージョンに、*my-cluster* はクラスターの名前に置き換えます。

```
eksctl get capability \
  --region region-code \
  --cluster my-cluster \
  --name my-argocd
```

ステータスが `ACTIVE` と表示されたら、機能の準備は完了です。

## ステップ 6: カスタムリソースが使用可能であることを確認する
<a name="_step_6_verify_custom_resources_are_available"></a>

機能がアクティブになったら、Argo CD カスタムリソースがクラスターで使用可能になっていることを確認します。

```
kubectl api-resources | grep argoproj.io
```

`Application` と `ApplicationSet` のリソースタイプがリストされます。

## 次のステップ
<a name="_next_steps"></a>
+  [Argo CD の使用](working-with-argocd.md) - Argo CD Application を作成および管理する方法を学ぶ
+  [Argo CD に関する考慮事項](argocd-considerations.md) - SSO とマルチクラスターアクセスを設定する
+  [機能リソースの使用](working-with-capabilities.md) - Argo CD 機能リソースを管理する

# Argo CD の概念
<a name="argocd-concepts"></a>

Argo CD は、Git をアプリケーションデプロイの信頼できる単一のソースとして扱うことで GitOps を実装します。このトピックでは、実践的な例を取り上げ、EKS Capability for Argo CD を使用する際に知っておくべきコアとなる概念について説明します。

## Argo CD の使用を開始する
<a name="_getting_started_with_argo_cd"></a>

Argo CD 機能を作成したら (「[Argo CD 機能を作成する](create-argocd-capability.md)」を参照)、アプリケーションのデプロイを開始できます。この例では、クラスターの登録と Application の作成を取り上げます。

### ステップ 1: 設定
<a name="_step_1_set_up"></a>

 **クラスターを登録する** (必須)

アプリケーションのデプロイ先となるクラスターを登録します。この例では、Argo CD が実行されているのと同じクラスターを登録します (`in-cluster` という名前を使用すると、Argo CD のほとんどの例との互換性を維持できます)。

```
# Get your cluster ARN
CLUSTER_ARN=$(aws eks describe-cluster \
  --name my-cluster \
  --query 'cluster.arn' \
  --output text)

# Register the cluster using Argo CD CLI
argocd cluster add $CLUSTER_ARN \
  --aws-cluster-name $CLUSTER_ARN \
  --name in-cluster \
  --project default
```

**注記**  
EKS で Argo CD 機能を使用するように Argo CD CLI を設定する方法については、「[マネージド機能で Argo CD CLI を使用する](argocd-comparison.md#argocd-cli-configuration)」を参照してください。

あるいは、Kubernetes シークレットを使用してクラスターを登録します (詳細については、「[ターゲットクラスターを登録する](argocd-register-clusters.md)」を参照)。

 **リポジトリアクセスを設定する** (任意)

この例では、パブリック GitHub リポジトリを使用しているため、リポジトリの設定は不要です。プライベートリポジトリの場合は、AWS Secrets Manager、CodeConnections、または Kubernetes シークレットを使用してアクセスを設定します (詳細については、「[リポジトリアクセスを設定する](argocd-configure-repositories.md)」を参照)。

AWS サービス (ECR Helm チャート、CodeConnections、および CodeCommit) の場合、リポジトリを作成しなくても、Application リソースで直接参照できます。機能ロールには、IAM アクセス許可が必要です。詳細については、「[リポジトリアクセスを設定する](argocd-configure-repositories.md)」を参照してください。

### ステップ 2: アプリケーションの作成
<a name="_step_2_create_an_application"></a>

`my-app.yaml` でこの Application マニフェストを作成します。

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    targetRevision: HEAD
    path: guestbook
  destination:
    name: in-cluster
    namespace: guestbook
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
```

Application を適用します。

```
kubectl apply -f my-app.yaml
```

この Application を適用したら、Argo CD で次の手順を実行します。1. Git からクラスターにアプリケーションを同期します (初期デプロイ)。2. Git リポジトリに対する変更をモニタリングします。3. 今後変更があればクラスターに自動的に同期します。4. 目的の状態からのドリフトを検出して修正します。5. UI でヘルスステータスと同期履歴を提供します。

アプリケーションのステータスを表示します。

```
kubectl get application guestbook -n argocd
```

Argo CD CLI または Argo CD UI (クラスターの [機能] タブの EKS コンソールからアクセス可能) を使用して、アプリケーションを表示することもできます。

**注記**  
マネージド機能で Argo CD CLI を使用する場合は、名前空間プレフィックス `argocd app get argocd/guestbook` を使用してアプリケーションを指定します。

**注記**  
`destination.name` でクラスター名 (クラスターの登録時に使用した名前) を使用します。マネージド機能は、ローカルのクラスター内デフォルト (`kubernetes.default.svc`) をサポートしていません。

## 重要な概念
<a name="_core_concepts"></a>

### GitOps の原則とソースタイプ
<a name="_gitops_principles_and_source_types"></a>

Argo CD は、GitOps を実装しており、アプリケーションソースがデプロイの信頼できる単一のソースとなります。
+  **宣言型** - 目的の状態は、YAML マニフェスト、Helm チャート、または Kustomize オーバーレイを使用して宣言されます。
+  **バージョン管理** - すべての変更が完全な監査証跡で追跡されます。
+  **自動** - Argo CD は、ソースを継続的にモニタリングし、変更を自動的に同期します。
+  **自己修復** - 目的のクラスター状態と実際のクラスター状態とのドリフトを検出して修正します。

 **サポートされているソースタイプ**:
+  **Git リポジトリ** - GitHub、GitLab、Bitbucket、CodeCommit (HTTPS、SSH、または CodeConnections)
+  **Helm レジストリ** - HTTP レジストリ (`https://aws.github.io/eks-charts` など) および OCI レジストリ (`public.ecr.aws` など)
+  **OCI イメージ** - マニフェストまたは Helm チャートが含まれているコンテナイメージ (`oci://registry-1.docker.io/user/my-app` など)

この柔軟性により、組織のセキュリティ要件とコンプライアンス要件を満たすソースを選択できます。例えば、クラスターからの Git アクセスを制限する場合は、Helm チャートや OCI イメージに ECR を使用できます。

詳細は、Argo CD ドキュメントの「[Application ソース](https://argo-cd.readthedocs.io/en/stable/user-guide/application-sources/)」を参照してください。

### 同期と調整
<a name="_sync_and_reconciliation"></a>

Argo CD は、ソースとクラスターを継続的にモニタリングして、差分を検出して修正します。

1. 変更がないかソースをポーリングします (デフォルト: 6 分ごと)。

1. 目的の状態とクラスターの状態を比較します。

1. アプリケーションを `Synced` または `OutOfSync` としてマークします。

1. 変更を自動的に同期するか (設定されている場合)、手動による承認を待ちます。

1. 同期後にリソースのヘルスをモニタリングします。

 **同期ウェーブ**は、注釈を使用してリソースの作成順序を制御します。

```
metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "0"  # Default if not specified
```

リソースはウェーブ順に適用されます (先頭は `-1` のような負の数値など、小さい数値です)。指定しない場合は、ウェーブ `0` がデフォルトになります。これにより、サービス (ウェーブ `1`) の前にデプロイ (ウェーブ `0`)、その前に名前空間 (ウェーブ `-1`) などの依存関係を作成できます。

 **自己修復**は、手動による変更を自動的に元に戻します。

```
spec:
  syncPolicy:
    automated:
      selfHeal: true
```

**注記**  
マネージド機能は、注釈ベース (ラベルベースではない) のリソース追跡を使用して、Kubernetes の規則やその他のツールとの互換性を高めます。

同期フェーズ、フック、高度なパターンの詳細については、[Argo CD 同期のドキュメント](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/)を参照してください。

### アプリケーションのヘルス
<a name="_application_health"></a>

Argo CD は、アプリケーション内のすべてのリソースのヘルスをモニタリングします。

 **ヘルスステータス**: \$1 **正常** - すべてのリソースが想定どおりに動作している \$1 **進行中** - リソースが作成中または更新中 \$1 **低下** - 一部のリソースが正常でない (ポッドのクラッシュやジョブの失敗) \$1 **中断** - アプリケーションが意図的に一時停止している \$1 **欠落** - Git に定義されたリソースがクラスターに存在しない

よく使用される Kubernetes リソース (デプロイ、StatefulSet、ジョブなど) に対しては組み込みのヘルスチェックで対処し、CRD に対してはカスタムヘルスチェックをサポートしています。

アプリケーションのヘルスは、アプリケーションのすべてのリソースによって決まります。いずれかのリソースが `Degraded` であれば、アプリケーションも `Degraded` です。

詳細については、Argo CD ドキュメントの「[リソースのヘルス](https://argo-cd.readthedocs.io/en/stable/operator-manual/health/)」を参照してください。

### マルチクラスターパターン
<a name="_multi_cluster_patterns"></a>

Argo CD は、主に 2 つのデプロイパターンをサポートしています。

 **ハブアンドスポーク** - 複数のワークロードクラスターにデプロイする専用の管理クラスターで Argo CD を実行します。\$1 一元管理と可視性 \$1 すべてのクラスターで一貫したポリシー \$1 Argo CD インスタンスを 1 つ管理 \$1 コントロールプレーンとワークロードとの明確な分離

 **クラスターあたり** - 各クラスターで Argo CD を実行して、そのクラスターのアプリケーションのみを管理します。\$1 クラスターの分離 (あるクラスターの障害が他のクラスターに影響を与えない) \$1 シンプルなネットワーク (クラスター間の通信なし) \$1 シンプルな初期セットアップ (クラスターの登録なし)

プラットフォームチームが多数のクラスターを管理する場合はハブアンドスポークを選択し、チームが独立している場合やクラスターを完全に分離する必要がある場合はクラスターあたりを選択します。

マルチクラスター設定の詳細については、「[Argo CD に関する考慮事項](argocd-considerations.md)」を参照してください。

### プロジェクト
<a name="_projects"></a>

Project を使用すると、Application を論理的にグループ化して、アクセスコントロールを付与できます。
+  **ソースの制限** - 使用できる Git リポジトリを制限します。
+  **送信先の制限** - ターゲットにできるクラスターと名前空間を制限します。
+  **リソースの制限** - デプロイできる Kubernetes リソースタイプを制限します。
+  **RBAC の統合** - Project を AWS アイデンティティセンターのユーザー ID とグループ ID にマッピングします。

Application は単一の Project に属します。指定しない場合は、`default` プロジェクトが使用されます。これにはデフォルトの制限はありません。本番稼働用の場合は、`default` プロジェクトを編集してアクセスを制限し、適切な制限で新しいプロジェクトを作成します。

Project の設定と RBAC パターンについては、「[Argo CD アクセス許可を設定する](argocd-permissions.md)」を参照してください。

### 同期オプション
<a name="_sync_options"></a>

よく使用されるオプションで同期動作をファインチューニングします。
+  `CreateNamespace=true` - 送信先名前空間を自動的に作成します。
+  `ServerSideApply=true` - サーバー側の適用機能を使用して的確に競合を解決します。
+  `SkipDryRunOnMissingResource=true` - CRD がまだ存在しない場合には、ドライランをスキップします (kro インスタンスに有用です)。

```
spec:
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
    - ServerSideApply=true
    - SkipDryRunOnMissingResource=true
```

同期オプションの完全なリストについては、[Argo CD 同期オプションのドキュメント](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-options/)を参照してください。

## 次のステップ
<a name="_next_steps"></a>
+  [リポジトリアクセスを設定する](argocd-configure-repositories.md) - Git リポジトリアクセスを設定する
+  [ターゲットクラスターを登録する](argocd-register-clusters.md) - デプロイ用にターゲットクラスターを登録する
+  [Application を作成する](argocd-create-application.md) - 最初の Application を作成する
+  [Argo CD に関する考慮事項](argocd-considerations.md) - EKS 固有のパターン、アイデンティティセンター統合、マルチクラスター設定
+  [Argo CD ドキュメント](https://argo-cd.readthedocs.io/en/stable/) - 同期フック、ヘルスチェック、高度なパターンなどについて説明した包括的な Argo CD ドキュメント

# Argo CD アクセス許可を設定する
<a name="argocd-permissions"></a>

Argo CD マネージド機能は、AWS アイデンティティセンターとの統合により認証を実施し、組み込みの RBAC ロールを使用して認可を行います。このトピックでは、ユーザーとチームに対するアクセス許可を設定する方法について説明します。

## Argo CD によるアクセス許可の仕組み
<a name="_how_permissions_work_with_argo_cd"></a>

Argo CD 機能は、AWS アイデンティティセンターを使用して認証を実施し、組み込みの 3 つの RBAC ロールを使用して認可を行います。

ユーザーが Argo CD にアクセスすると、次のようになります。

1. AWS アイデンティティセンターを使用してユーザーが認証されます (社内の ID プロバイダーにフェデレーションできます)。

1.  AWS アイデンティティセンターは、ユーザーとグループの情報を Argo CD に提供します。

1. Argo CD は、現在の設定に基づいてユーザーとグループを RBAC ロールにマッピングします。

1. ユーザーには、自分がアクセス許可を持つアプリケーションとリソースのみが表示されます。

## 組み込みの RBAC ロール
<a name="_built_in_rbac_roles"></a>

Argo CD 機能には、AWS アイデンティティセンターのユーザーとグループにマッピングする組み込みのロールが 3 つあります。これらは、プロジェクト、クラスター、リポジトリなどの Argo CD リソースへのアクセスを制御する**グローバルスコープのロール**です。

**重要**  
グローバルロールは、Application などのプロジェクトスコープのリソースではなく、Argo CD 自体へのアクセスを制御します。EDITOR ユーザーおよび VIEWER ユーザーは、デフォルトでは Application を表示または管理できません。プロジェクトスコープのリソースにアクセスするには、プロジェクトロールが必要です。Application およびその他のプロジェクトスコープのリソースへのアクセス許可の詳細については、「[プロジェクトロールとプロジェクトスコープのアクセス](#project-roles)」を参照してください。

 **ADMIN** 

すべての Argo CD リソースと設定へのフルアクセス:
+ 任意のプロジェクト内の Application と ApplicationSet を作成、更新、削除する
+ Argo CD 設定を管理する
+ デプロイターゲットクラスターを登録して管理する
+ リポジトリアクセスを設定する
+ プロジェクトを作成および管理する
+ すべてのアプリケーションのステータスと履歴を表示する
+ すべてのクラスターとリポジトリを一覧表示してアクセスする

 **EDITOR** 

プロジェクトを更新してプロジェクトロールを設定できますが、グローバル Argo CD 設定を変更することはできません。
+ 既存のプロジェクトを更新する (プロジェクトの新規作成および削除はできません)
+ プロジェクトロールとアクセス許可を設定する
+ GPG キーと証明書を表示する
+ グローバル Argo CD 設定を変更できない
+ クラスターとリポジトリを直接管理できない
+ プロジェクトロールがないと Application を表示または管理できない

 **VIEWER** 

Argo CD リソースへの読み取り専用アクセス:
+ プロジェクト設定を表示する
+ すべてのプロジェクト (ユーザーが割り当てられていないプロジェクトを含む) を一覧表示する
+ GPG キーと証明書を表示する
+ クラスターまたはリポジトリを一覧表示できない
+ 変更を加えることはできない
+ プロジェクトロールがないと Application を表示または管理できない

**注記**  
EDITOR ユーザーまたは VIEWER ユーザーに Application へのアクセス権を付与するには、ADMIN または EDITOR が、アイデンティティセンターグループをプロジェクト内の特定のアクセス許可にマッピングするプロジェクトロールを作成する必要があります。

## プロジェクトロールとプロジェクトスコープのアクセス
<a name="project-roles"></a>

グローバルロール (ADMIN、EDITOR、VIEWER) は、Argo CD 自体へのアクセスを制御します。プロジェクトロールは、以下を含む特定のプロジェクト内のリソースと機能へのアクセスを制御します。
+  **リソース**: Application、ApplicationSet、リポジトリ認証情報、クラスター認証情報
+  **機能**: アプリケーションポッドへのログアクセスと実行アクセス

 **2 レベルのアクセス許可モデルについて**:
+  **グローバルスコープ**: 組み込みロールは、ユーザーがプロジェクト、クラスター、リポジトリ、および Argo CD 設定で何ができるかを決定します
+  **プロジェクトスコープ**: プロジェクトロールは、ユーザーが特定のプロジェクト内のリソースと機能で何ができるかを決定します

つまり、次のようになります。
+ ADMIN ユーザーは、追加の設定なしですべてのプロジェクトリソースと機能にアクセスできます
+ EDITOR ユーザーおよび VIEWER ユーザーには、プロジェクトのリソースと機能にアクセスするためのプロジェクトロールを付与する必要があります
+ EDITOR ユーザーは、更新できるプロジェクト内で、自分やそれ以外のユーザーにアクセス権を付与するプロジェクトロールを作成できます。

 **ワークフローの例**:

1. ADMIN は、アイデンティティセンターグループを EDITOR ロールにグローバルにマッピングします。

1. ADMIN がチームのプロジェクトを作成する

1. EDITOR は、そのプロジェクト内のプロジェクトロールを設定して、チームメンバーにプロジェクトスコープのリソースへのアクセス権を付与します。

1. チームメンバー (VIEWER グローバルロールを持つ可能性がある) は、プロジェクトロールのアクセス許可に基づいて、そのプロジェクトの Application を表示および管理できるようになりました。

プロジェクトロールの設定の詳細については、「[Project ベースのアクセスコントロール](#_project_based_access_control)」を参照してください。

## ロールマッピングを設定する
<a name="_configure_role_mappings"></a>

機能の作成時や更新時に、AWS アイデンティティセンターのユーザーとグループを Argo CD ロールにマッピングします。

 **ロールマッピングの例**:

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["AdminGroup", "alice@example.com"],
    "EDITOR": ["DeveloperGroup", "DevOpsTeam"],
    "VIEWER": ["ReadOnlyGroup", "bob@example.com"]
  }
}
```

**注記**  
ロール名は、大文字と小文字が区別され、大文字 (ADMIN、EDITOR、VIEWER) にする必要があります。

**重要**  
EKS 機能と AWS アイデンティティセンターが統合されている場合、Argo CD 機能あたり最大 1,000 個の ID がサポートされます。ユーザーやグループを ID にすることができます。

 **ロールマッピングを更新する**:

```
aws eks update-capability \
  --region us-east-1 \
  --cluster-name cluster \
  --capability-name capname \
  --endpoint "https://eks.ap-northeast-2.amazonaws.com" \
  --role-arn "arn:aws:iam::[.replaceable]111122223333:role/[.replaceable]`EKSCapabilityRole`" \
  --configuration '{
    "argoCd": {
      "rbacRoleMappings": {
        "addOrUpdateRoleMappings": [
          {
            "role": "ADMIN",
            "identities": [
              { "id": "686103e0-f051-7068-b225-e6392b959d9e", "type": "SSO_USER" }
            ]
          }
        ]
      }
    }
  }'
```

## 管理者アカウントの使用法
<a name="_admin_account_usage"></a>

管理者アカウントは、クラスターの登録やリポジトリの設定など、初期セットアップと管理タスク向けに設計されています。

 **どのような場合に管理者アカウントが適切か**:
+ 機能の初期セットアップと設定
+ 単独開発や迅速なデモンストレーション
+ 管理タスク (クラスターの登録、リポジトリの設定、Project の作成)

 **管理者アカウントのベストプラクティス**:
+ アカウントトークンをバージョン管理にコミットしない
+ トークンが漏洩したらすぐにローテーションさせる
+ アカウントトークンの用途をセットアップと管理タスクに制限する
+ 有効期限を短くする (最大 12 時間)
+ 一度に作成できるアカウントトークンを 5 つまでとする

 **どのような場合に Project ベースのアクセスを使用するか**:
+ 複数のユーザーと開発環境を共有する場合
+ いずれの環境も本番稼働と同様にする場合
+ 誰がアクションを実行したかを監査証跡に残す場合
+ リソース制限やアクセス境界を設ける場合

本番稼働環境とマルチユーザーシナリオでは、専用の RBAC ロールを AWS アイデンティティセンターグループにマッピングして、Project ベースのアクセスコントロールを使用します。

## Project ベースのアクセスコントロール
<a name="_project_based_access_control"></a>

Argo CD Project (AppProject) を使用すると、チームを対象にアクセスコントロールとリソース分離をきめ細かく設定できます。

**重要**  
ユーザーまたはグループをプロジェクト固有のロールに割り当てる前に、まず機能設定でグローバル Argo CD ロール (ADMIN、EDITOR、または VIEWER) にマッピングする必要があります。ユーザーは、プロジェクトロールに割り当てられていても、グローバルロールマッピングなしで Argo CD にアクセスすることはできません。  
ユーザーを VIEWER ロールにグローバルにマッピングし、プロジェクト固有のロールを通じて追加のアクセス許可を付与することを検討してください。これにより、ベースラインアクセスが可能になり、プロジェクトレベルでのきめ細かな制御が可能になります。

Project でできることは以下のとおりです。
+  **ソースの制限**: 使用できる Git リポジトリを制限します。
+  **送信先の制限**: ターゲットにできるクラスターと名前空間を制限します。
+  **リソースの制限**: デプロイできる Kubernetes リソースタイプを制限します。
+  **RBAC の統合**: Project を AWS アイデンティティセンターグループまたは Argo CD ロールにマッピングします。

 **チームを分離する Project の例**:

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  description: Team A applications

  # Required: Specify which namespaces this project watches for Applications
  sourceNamespaces:
  - argocd

  # Source restrictions
  sourceRepos:
  - https://github.com/myorg/team-a-apps

  # Destination restrictions
  destinations:
  - namespace: team-a-*
    server: arn:aws:eks:us-west-2:111122223333:cluster/production

  # Resource restrictions
  clusterResourceWhitelist:
  - group: ''
    kind: Namespace
  namespaceResourceWhitelist:
  - group: 'apps'
    kind: Deployment
  - group: ''
    kind: Service
  - group: ''
    kind: ConfigMap
```

### ソース名前空間
<a name="_source_namespaces"></a>

EKS Argo CD 機能を使用する場合は、AppProject 定義で `spec.sourceNamespaces` フィールドが必要です。このフィールドは、このプロジェクトを参照する Application または ApplicationSet を含めることができる名前空間を指定します。

**重要**  
EKS Argo CD 機能は、Application と ApplicationSet 向けに一つの名前空間のみをサポートします。具体的には、機能の作成時に指定した名前空間になります (通常は `argocd`)。これは、複数の名前空間をサポートするオープンソースの Argo CD とは異なります。

 **AppProject の設定** 

すべての AppProject は、その機能の設定済み名前空間を `sourceNamespaces` に含める必要があります。

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a-project
  namespace: argocd
spec:
  description: Applications for Team A

  # Required: Specify the capability's configured namespace (configuration.argoCd.namespace)
  sourceNamespaces:
    - argocd  # Must match your capability's namespace configuration

  # Source repositories this project can deploy from
  sourceRepos:
    - 'https://github.com/my-org/team-a-*'

  # Destination restrictions
  destinations:
    - namespace: 'team-a-*'
      server: arn:aws:eks:us-west-2:111122223333:cluster/my-cluster
```

**注記**  
機能の名前空間を `sourceNamespaces` に含めないと、その名前空間の Application または ApplicationSet はこのプロジェクトを参照できず、デプロイが失敗します。

 **ユーザーを Project に割り当てる**:

プロジェクトロールは、EDITOR ユーザーおよび VIEWER ユーザーにプロジェクトリソース (Application、ApplicationSet、リポジトリ、クラスター認証情報) と機能 (ログ、実行) へのアクセスを許可します。プロジェクトロールがないと、これらのユーザーは、グローバルロールアクセスを持っていてもこれらのリソースにアクセスできません。

ADMIN ユーザーは、プロジェクトロールを必要とせずに、すべての Application にアクセスできます。

 **例: チームメンバーに Application へのアクセスを許可する** 

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  # ... project configuration ...

  sourceNamespaces:
  - argocd

  # Project roles grant Application-level access
  roles:
  - name: developer
    description: Team A developers - can manage Applications
    policies:
    - p, proj:team-a:developer, applications, *, team-a/*, allow
    - p, proj:team-a:developer, clusters, get, *, allow  # See cluster names in UI
    groups:
    - 686103e0-f051-7068-b225-e6392b959d9e  # Identity Center group ID

  - name: viewer
    description: Team A viewers - read-only Application access
    policies:
    - p, proj:team-a:viewer, applications, get, team-a/*, allow
    - p, proj:team-a:viewer, clusters, get, *, allow  # See cluster names in UI
    groups:
    - 786203e0-f051-7068-b225-e6392b959d9f  # Identity Center group ID
```

**注記**  
プロジェクトロールに `clusters, get, *, allow` を含めることで、ユーザーが UI でクラスター名を表示できるようにします。このアクセス許可がない場合、送信先クラスターは「Unknown」として表示されます。

 **プロジェクトロールポリシーについて**:

ポリシーの形式は次のとおりです: `p, proj:<project>:<role>, <resource>, <action>, <object>, <allow/deny>` 

 **リソースポリシー**:
+  `applications, , team-a/, allow` – team-a プロジェクト内のすべての Application にフルアクセスできます
+  `applications, get, team-a/*, allow` – Application に読み取り専用でアクセスできます
+  `applications, sync, team-a/*, allow` – Application を同期できますが、作成/削除することはできません
+  `applications, delete, team-a/*, allow` – Application を削除できます (注意して使用すること)
+  `applicationsets, , team-a/, allow` – ApplicationSet にフルアクセスできます
+  `repositories, *, *, allow` – リポジトリ認証情報にアクセスできます
+  `clusters, *, *, allow` – クラスター認証情報にアクセスできます

 **機能ポリシー**:
+  `logs, , team-a/, allow` – アプリケーションログにアクセスできます
+  `exec, , team-a/, allow` – アプリケーションポッドへの実行アクセス

**注記**  
EDITOR ユーザーは、更新できるプロジェクト内で、自分やそれ以外のユーザーにアクセス許可を付与するプロジェクトロールを作成できます。これにより、チームリーダーは ADMIN の介入を必要とせずに、チームのプロジェクトスコープのリソースへのアクセスを制御できます。

**注記**  
`groups` フィールドでアイデンティティセンターグループ ID (グループ名ではない) を使用します。個別のユーザーアクセスにアイデンティティセンターユーザー ID を使用することもできます。AWS アイデンティティセンターコンソール内、または AWS CLI を使用してこれらの ID を検索します。

## アクセス許可のよくあるパターン
<a name="_common_permission_patterns"></a>

 **パターン 1: 管理チームにフルアクセスを付与する** 

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["PlatformTeam", "SRETeam"]
  }
}
```

ADMIN ユーザーは、追加の設定なしで、すべてのプロジェクトスコープのリソースを表示および管理できます。

 **パターン 2: チームリーダーがプロジェクトを管理し、開発者がプロジェクトロール経由でアクセスする** 

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["PlatformTeam"],
    "EDITOR": ["TeamLeads"],
    "VIEWER": ["AllDevelopers"]
  }
}
```

1. ADMIN はチームごとにプロジェクトを作成する

1. チームリーダー (EDITOR) は、開発者にプロジェクトリソース (Application、ApplicationSet、認証情報) と機能 (ログ、実行) へのアクセスを許可するようにプロジェクトロールを設定する

1. 開発者 (VIEWER) は、プロジェクトロールで許可されているリソースと機能にのみアクセスできる

 **パターン 3: プロジェクトロールを使用したチームベースのアクセス** 

1. ADMIN はプロジェクトを作成し、チームリーダーを EDITOR ロールにグローバルにマッピングする

1. チームリーダー (EDITOR) は、チームメンバーをプロジェクト内のプロジェクトロールに割り当てる

1. チームメンバーには VIEWER グローバルロールのみが必要 – プロジェクトロールはプロジェクトリソースと機能へのアクセスを提供する

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["PlatformTeam"],
    "EDITOR": ["TeamLeads"],
    "VIEWER": ["AllDevelopers"]
  }
}
```

## ベストプラクティス
<a name="_best_practices"></a>

 **個々のユーザーではなくグループを使用する**: AWS アイデンティティセンターグループを個々のユーザーではなく Argo CD ロールにマッピングして、管理を容易にします。

 **最小特権から開始する**: VIEWER アクセスから開始し、必要に応じて EDITOR または ADMIN を付与します。

 **Project を使用してチームを分離する**: チームや環境ごとに AppProject を作成して、境界を確立します。

 **アイデンティティセンターのフェデレーションを活用する**: 社内の ID プロバイダーとフェデレーションするように AWS アイデンティティセンターを設定して、ユーザー管理を一元化します。

 **アクセスを定期的に見直す**: ロールのマッピングと Project の割り当てを定期的に見直して、適切なアクセスレベルを確保します。

 **クラスターへのアクセスを制限する**: Argo CD RBAC は Argo CD リソースとオペレーションへのアクセスを制御しますが、Kubernetes RBAC には対応していないことに注意してください。Argo CD にアクセスできるユーザーは、Argo CD がアクセスできるクラスターにアプリケーションをデプロイできます。Argo CD がアクセスできるクラスターを制限し、Project の宛先制限を使用して、アプリケーションをデプロイできる場所を制御します。

## AWS サービスのアクセス許可
<a name="shared_aws_service_permissions"></a>

Repository リソースを作成することなく Application リソースで AWS サービスを直接使用するには、必要な IAM アクセス許可を機能ロールにアタッチします。

 **ECR Helm チャート**:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage"
      ],
      "Resource": "*"
    }
  ]
}
```

 **CodeCommit リポジトリ**:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "codecommit:GitPull"
      ],
      "Resource": "arn:aws:codecommit:region:account-id:repository-name"
    }
  ]
}
```

 **CodeConnections (GitHub、GitLab、Bitbucket)**:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "codeconnections:UseConnection"
      ],
      "Resource": "arn:aws:codeconnections:region:account-id:connection/connection-id"
    }
  ]
}
```

こうした統合の使用の詳細については、「[リポジトリアクセスを設定する](argocd-configure-repositories.md)」を参照してください。

## 次のステップ
<a name="_next_steps"></a>
+  [Argo CD の使用](working-with-argocd.md) - アプリケーションを作成してデプロイを管理する方法を学ぶ
+  [Argo CD の概念](argocd-concepts.md) - Project など Argo CD の概念を理解する
+  [EKS 機能のセキュリティに関する考慮事項](capabilities-security.md) - 機能のセキュリティのベストプラクティスを見直す

# Argo CD の使用
<a name="working-with-argocd"></a>

Argo CD では、Git リポジトリでアプリケーションを定義し、Argo CD はそれらを Kubernetes クラスターに自動的に同期します。これにより、自動ドリフト検出による宣言型のバージョン管理されたアプリケーションのデプロイが可能になります。

## 前提条件
<a name="_prerequisites"></a>

Argo CD を使用する前に、以下が必要です。
+ EKS クラスターに Argo CD 機能が作成されていること (「[Argo CD 機能を作成する](create-argocd-capability.md)」を参照)
+ Git リポジトリに Kubernetes マニフェストが含まれていること
+  クラスターと通信できるように `kubectl` が設定されていること

## 一般的なタスク
<a name="_common_tasks"></a>

以下のトピックでは、一般的な Argo CD タスクについて説明します。

 ** [リポジトリアクセスを設定する](argocd-configure-repositories.md) ** - AWS Secrets Manager、AWS CodeConnections、または Kubernetes Secrets を使用して、Git リポジトリにアクセスするように Argo CD を設定します。

 ** [ターゲットクラスターを登録する](argocd-register-clusters.md) ** - Argo CD がアプリケーションをデプロイするターゲットクラスターを登録します。

 ** [Argo CD Project を操作する](argocd-projects.md) ** - マルチテナント環境向けにプロジェクトを使用してアプリケーションを整理し、セキュリティ境界を適用します。

 ** [Application を作成する](argocd-create-application.md) ** - 自動または手動の同期ポリシーを使用して、Git リポジトリからデプロイするアプリケーションを作成します。

 ** [ApplicationSet を使用する](argocd-applicationsets.md) ** - テンプレートとジェネレーターを使用して、複数の環境またはクラスターにアプリケーションをデプロイするために ApplicationSets を使用します。

## Argo CD UI にアクセスする
<a name="_access_the_argo_cd_ui"></a>

EKS コンソールから Argo CD UI にアクセスします。

1. Amazon EKS コンソールを開きます。

1. クラスターを選択します。

1. **[機能]** タブを選択します。

1. **[Argo CD]** を選択します。

1. **[Argo CD UI を開く]** を選択します。

UI は、アプリケーションのトポロジを視覚的に表示し、同期のステータスと履歴、リソースのヘルスとイベント、手動同期コントロール、アプリケーション管理を提供します。

## アップストリームドキュメント
<a name="_upstream_documentation"></a>

Argo CD 機能の詳細については、以下を参照してください。
+  [Argo CD ドキュメント](https://argo-cd.readthedocs.io/) - 完全なユーザーガイド
+  [アプリケーション仕様](https://argo-cd.readthedocs.io/en/stable/user-guide/application-specification/) - フルアプリケーション API リファレンス
+  [ApplicationSet ガイド](https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/) - ApplicationSet のパターンと例
+  [Argo CD GitHub](https://github.com/argoproj/argo-cd) - ソースコードと例

# リポジトリアクセスを設定する
<a name="argocd-configure-repositories"></a>

アプリケーションをデプロイする前に、Git リポジトリおよび Helm チャートレジストリにアクセスするように Argo CD を設定します。Argo CD は、GitHub、GitLab、Bitbucket、AWS CodeCommit、AWS ECR に対応するために複数の認証方法をサポートしています。

**注記**  
直接 AWS サービス統合 (ECR Helm チャート、CodeCommit リポジトリ、CodeConnections) の場合、リポジトリ設定を作成しなくても、Application リソースで直接参照できます。機能ロールには、IAM アクセス許可が必要です。詳細については、「[Argo CD アクセス許可を設定する](argocd-permissions.md)」を参照してください。

## 前提条件
<a name="_prerequisites"></a>
+ EKS クラスターに Argo CD 機能が作成されていること
+ Git リポジトリに Kubernetes マニフェストが含まれていること
+  クラスターと通信できるように `kubectl` が設定されていること

**注記**  
 AWS CodeConnections は、AWS クラウドまたはオンプレミスにある Git サーバーに接続できます。詳細については、「[AWS CodeConnections](https://docs.aws.amazon.com/codeconnections/latest/userguide/welcome.html)」を参照してください。

## 認証方法
<a name="_authentication_methods"></a>


| Method | ユースケース | 必要な IAM アクセス許可 | 
| --- | --- | --- | 
|   **AWS サービスとの直接統合**   | 
|  CodeCommit  |  AWS CodeCommit Git リポジトリとの直接統合。リポジトリ設定は不要です。  |   `codecommit:GitPull`   | 
|  CodeConnections  |  マネージド認証で GitHub、GitLab、または Bitbucket に接続します。接続のセットアップが必要です。  |   `codeconnections:UseConnection`   | 
|  ECR OCI アーティファクト  |  AWS ECR for OCI Helm チャートとマニフェスト画像の直接統合。リポジトリ設定は不要です。  |   `arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly`   | 
|   **認証情報によるリポジトリ設定**   | 
|   AWS Secrets Manager (ユーザー名/トークン)  |  個人用アクセストークンまたはパスワードを保存します。Kubernetes アクセスなしで認証情報のローテーションを有効にします。  |   `arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess`   | 
|   AWS Secrets Manager (SSH キー)  |  SSH キー認証を使用します。Kubernetes アクセスなしで認証情報のローテーションを有効にします。  |   `arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess`   | 
|   AWS Secrets Manager (GitHub アプリ)  |  プライベートキーによる GitHub アプリの認証。Kubernetes アクセスなしで認証情報のローテーションを有効にします。  |   `arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess`   | 
|  Kubernetes シークレット  |  クラスター内シークレットを使用した標準の Argo CD 方法  |  なし (Kubernetes RBAC を使用した EKS アクセスエントリによって処理されるアクセス許可)  | 

## AWS サービスへの直接アクセス
<a name="direct_access_to_shared_aws_services"></a>

AWS サービスの場合、リポジトリ設定を作成しなくても、Application リソースで直接参照できます。機能ロールには、IAM アクセス許可が必要です。

### CodeCommit リポジトリ
<a name="_codecommit_repositories"></a>

Application 内で直接 CodeCommit リポジトリを参照します。

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  source:
    repoURL: https://git-codecommit.region.amazonaws.com/v1/repos/repository-name
    targetRevision: main
    path: kubernetes/manifests
```

必要な機能ロールアクセス許可:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "codecommit:GitPull",
      "Resource": "arn:aws:codecommit:region:account-id:repository-name"
    }
  ]
}
```

### CodeConnections
<a name="_codeconnections"></a>

CodeConnections を介して GitHub、GitLab、Bitbucket のリポジトリを参照します。リポジトリ URL 形式は、CodeConnections 接続 ARN から取得されます。

リポジトリ URL 形式は、次のとおりです。

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  source:
    repoURL: https://codeconnections.region.amazonaws.com/git-http/account-id/region/connection-id/owner/repository.git
    targetRevision: main
    path: kubernetes/manifests
```

必要な機能ロールアクセス許可:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "codeconnections:UseConnection",
      "Resource": "arn:aws:codeconnections:region:account-id:connection/connection-id"
    }
  ]
}
```

### ECR Helm チャート
<a name="_ecr_helm_charts"></a>

ECR は、Helm チャートを OCI アーティファクトとして保存します。Argo CD では、次の 2 つの方法でそれらを参照できます。

 **Helm 形式** (Helm チャートの場合に推奨):

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-helm
  namespace: argocd
spec:
  source:
    repoURL: account-id.dkr.ecr.region.amazonaws.com/repository-name
    targetRevision: chart-version
    chart: chart-name
    helm:
      valueFiles:
        - values.yaml
```

注意: Helm 形式を使用するときは、`oci://` プレフィックスを含めないでください。`chart` フィールドにチャート名を指定します。

 **OCI 形式** (Kubernetes マニフェストを含む OCI アーティファクトの場合):

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-oci
  namespace: argocd
spec:
  source:
    repoURL: oci://account-id.dkr.ecr.region.amazonaws.com/repository-name
    targetRevision: artifact-version
    path: path-to-manifests
```

注意: OCI 形式を使用するときは、`oci://` プレフィックスを含めてください。`chart` ではなく `path` フィールドを使用します。

必要な機能ロールのアクセス許可 – マネージドポリシーをアタッチします。

```
arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly
```

このポリシーには、必要な ECR アクセス許可である `ecr:GetAuthorizationToken`、`ecr:BatchGetImage`、および `ecr:GetDownloadUrlForLayer` が含まれます。

## AWS Secrets Manager を使用する
<a name="using_shared_aws_secrets_manager"></a>

Secrets Manager にリポジトリ認証情報を保存して、Argo CD リポジトリ設定で参照します。Secrets Manager を使用すると、Kubernetes RBAC アクセスを必要とせずに認証情報の自動ローテーションが有効になります。認証情報は Secrets Manager への IAM アクセス許可を使用してローテーションでき、Argo CD は更新された値を自動的に読み取ります。

**注記**  
複数のリポジトリ (GitHub 組織内のすべてのリポジトリなど) で認証情報を再利用するには、`argocd.argoproj.io/secret-type: repo-creds` でリポジトリ認証情報テンプレートを使用します。これにより、個別のリポジトリシークレットを作成するよりも UX が向上します。詳細については、Argo CD ドキュメントの「[Repository Credentials](https://argo-cd.readthedocs.io/en/stable/operator-manual/argocd-repo-creds-yaml/)」を参照してください。

### ユーザー名とトークンの認証
<a name="_username_and_token_authentication"></a>

HTTPS リポジトリに個人用アクセストークンやパスワードが含まれている場合:

 **Secrets Manager にシークレットを作成する**:

```
aws secretsmanager create-secret \
  --name argocd/my-repo \
  --description "GitHub credentials for Argo CD" \
  --secret-string '{"username":"your-username","token":"your-personal-access-token"}'
```

 **オプションの TLS クライアント証明書フィールド** (プライベート Git サーバーの場合):

```
aws secretsmanager create-secret \
  --name argocd/my-private-repo \
  --secret-string '{
    "username":"your-username",
    "token":"your-token",
    "tlsClientCertData":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi4uLgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t",
    "tlsClientCertKey":"LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCi4uLgotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0t"
  }'
```

**注記**  
`tlsClientCertData` と `tlsClientCertKey` の値は、Base64 でエンコードされている必要があります。

 **Secrets Manager を参照するリポジトリシークレットを作成する**:

```
apiVersion: v1
kind: Secret
metadata:
  name: my-repo
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://github.com/your-org/your-repo
  secretArn: arn:aws:secretsmanager:us-west-2:111122223333:secret:argocd/my-repo-AbCdEf
  project: default
```

### SSH キー認証
<a name="_ssh_key_authentication"></a>

SSH ベースの Git アクセスの場合、プライベートキーを JSON ではなくプレーンテキストとして保存します。

 **SSH プライベートキーでシークレットを作成する**:

```
aws secretsmanager create-secret \
  --name argocd/my-repo-ssh \
  --description "SSH key for Argo CD" \
  --secret-string "-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
...
-----END OPENSSH PRIVATE KEY-----"
```

 **SSH 用にリポジトリシークレットを作成する**:

```
apiVersion: v1
kind: Secret
metadata:
  name: my-repo-ssh
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: git@github.com:your-org/your-repo.git
  secretArn: arn:aws:secretsmanager:us-west-2:111122223333:secret:argocd/my-repo-ssh-AbCdEf
  project: default
```

### GitHub アプリ認証
<a name="_github_app_authentication"></a>

プライベートキーによる GitHub アプリ認証の場合:

 **GitHub アプリ認証情報でシークレットを作成する**:

```
aws secretsmanager create-secret \
  --name argocd/github-app \
  --description "GitHub App credentials for Argo CD" \
  --secret-string '{
    "githubAppPrivateKeySecret":"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQouLi4KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0=",
    "githubAppID":"123456",
    "githubAppInstallationID":"12345678"
  }'
```

**注記**  
`githubAppPrivateKeySecret` 値は、Base64 でエンコードされている必要があります。

 **GitHub Enterprise のオプションのフィールド**:

```
aws secretsmanager create-secret \
  --name argocd/github-enterprise-app \
  --secret-string '{
    "githubAppPrivateKeySecret":"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQouLi4KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0=",
    "githubAppID":"123456",
    "githubAppInstallationID":"12345678",
    "githubAppEnterpriseBaseUrl":"https://github.example.com/api/v3"
  }'
```

 **GitHub アプリ用にリポジトリシークレットを作成する**:

```
apiVersion: v1
kind: Secret
metadata:
  name: my-repo-github-app
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://github.com/your-org/your-repo
  secretArn: arn:aws:secretsmanager:us-west-2:111122223333:secret:argocd/github-app-AbCdEf
  project: default
```

### リポジトリ認証情報テンプレート
<a name="_repository_credential_templates"></a>

複数のリポジトリ (GitHub 組織またはユーザーのすべてのリポジトリなど) で認証情報を再利用するには、`argocd.argoproj.io/secret-type: repo-creds` でリポジトリ認証情報テンプレートを使用します。これにより、リポジトリごとに個別のリポジトリシークレットを作成するよりも UX が向上します。

 **リポジトリ認証情報テンプレートを作成します**。

```
apiVersion: v1
kind: Secret
metadata:
  name: github-org-creds
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repo-creds
stringData:
  type: git
  url: https://github.com/your-org
  secretArn: arn:aws:secretsmanager:us-west-2:111122223333:secret:argocd/github-org-AbCdEf
```

この認証情報テンプレートは、URL プレフィックス `https://github.com/your-org` に一致するすべてのリポジトリに適用されます。その後、追加のシークレットを作成せずに、この組織内の任意のリポジトリを Application で参照できます。

詳細については、Argo CD ドキュメントの「[Repository Credentials](https://argo-cd.readthedocs.io/en/stable/operator-manual/argocd-repo-creds-yaml/)」を参照してください。

**重要**  
IAM 機能ロールにマネージドポリシー `arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess` がアタッチされているか、`secretsmanager:GetSecretValue` および KMS 復号アクセス許可を含む同等のアクセス許可がアタッチされていることを確認します。IAM ポリシーの設定については、「[Argo CD に関する考慮事項](argocd-considerations.md)」を参照してください。

## AWS CodeConnections を使用する
<a name="using_shared_aws_codeconnections"></a>

CodeConnections 統合については、「[AWS CodeConnections を使用して Git リポジトリに接続する](integration-codeconnections.md)」を参照してください。

CodeConnections のマネージド認証により、認証情報を保存することなく GitHub、GitLab、Bitbucket の認証を行うことができます。

## Kubernetes シークレットを使用する
<a name="_using_kubernetes_secrets"></a>

Argo CD の標準の方法を使用して、認証情報を Kubernetes に直接保存します。

 **HTTPS で個人用アクセストークンを使用する場合**:

```
apiVersion: v1
kind: Secret
metadata:
  name: my-repo
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://github.com/your-org/your-repo
  username: your-username
  password: your-personal-access-token
```

 **SSH の場合**:

```
apiVersion: v1
kind: Secret
metadata:
  name: my-repo-ssh
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: git@github.com:your-org/your-repo.git
  sshPrivateKey: |
    -----BEGIN OPENSSH PRIVATE KEY-----
    ... your private key ...
    -----END OPENSSH PRIVATE KEY-----
```

## CodeCommit リポジトリ
<a name="_codecommit_repositories_2"></a>

AWS CodeCommit の場合、IAM 機能ロールに CodeCommit アクセス許可を付与します (`codecommit:GitPull`)。

リポジトリを設定します。

```
apiVersion: v1
kind: Secret
metadata:
  name: codecommit-repo
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://git-codecommit.us-west-2.amazonaws.com/v1/repos/my-repo
  project: default
```

IAM ポリシー設定の詳細については、「[Argo CD に関する考慮事項](argocd-considerations.md)」を参照してください。

## リポジトリ接続を検証する
<a name="_verify_repository_connection"></a>

Argo CD UI の [設定] → [リポジトリ] から接続ステータスを確認します。UI には、接続ステータスと、認証エラーがあればそれも表示されます。

リポジトリシークレットにステータス情報は含まれません。

## その他のリソース
<a name="_additional_resources"></a>
+  [ターゲットクラスターを登録する](argocd-register-clusters.md) - デプロイ用にターゲットクラスターを登録する
+  [Application を作成する](argocd-create-application.md) - 最初の Application を作成する
+  [Argo CD に関する考慮事項](argocd-considerations.md) - IAM アクセス許可とセキュリティ設定
+  [プライベートリポジトリ](https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/) - アップストリームリポジトリ設定リファレンス

# ターゲットクラスターを登録する
<a name="argocd-register-clusters"></a>

クラスターを登録すると、Argo CD がアプリケーションをそのクラスターにデプロイできるようになります。Argo CD が動作しているのと同じクラスター (ローカルクラスター) を登録することも、別のアカウントやリージョンのリモートクラスターを登録することもできます。クラスターが新規登録されると、そのクラスター内にアプリケーションが作成されるまで、クラスターの接続ステータスは「不明」のままになります。クラスターの登録後に Argo CD アプリケーションを作成するには、「[Application を作成する](argocd-create-application.md)」を参照してください。

## 前提条件
<a name="_prerequisites"></a>
+ EKS クラスターに Argo CD 機能が作成されていること
+  クラスターと通信できるように `kubectl` が設定されていること
+ リモートクラスターの場合: 適切な IAM アクセス許可およびアクセスエントリ

## ローカルクラスターを登録する
<a name="_register_the_local_cluster"></a>

Argo CD が動作しているのと同じクラスターにアプリケーションをデプロイするには、そのクラスターをデプロイターゲットとして登録します。

**重要**  
Argo CD 機能は、ローカルクラスターを自動的には登録しません。アプリケーションを同じクラスターにデプロイするには、そのクラスターを明示的に登録する必要があります。クラスター名 `in-cluster` を使用して、ほとんどのオンラインの Argo CD の例と互換性を持たせることができます。

**注記**  
EKS アクセスエントリは、Argo CD 機能ロールを持つローカルクラスターに対して自動的に作成されますが、デフォルトでは Kubernetes RBAC アクセス許可は付与されません。これは最小特権の原則に従います。ユースケースに基づいて Argo CD に必要なアクセス許可を明示的に設定する必要があります。例えば、このクラスターを Argo CD ハブとしてのみ使用してリモートクラスターを管理する場合、ローカルデプロイのアクセス許可は必要ないはずです。設定オプションについては、以下のアクセスエントリ RBAC 要件セクションを参照してください。

 **Argo CD CLI を使用する**:

```
argocd cluster add <cluster-context-name> \
  --aws-cluster-name arn:aws:eks:us-west-2:111122223333:cluster/my-cluster \
  --name local-cluster
```

 **Kubernetes シークレットを使用する**:

```
apiVersion: v1
kind: Secret
metadata:
  name: local-cluster
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: cluster
stringData:
  name: local-cluster
  server: arn:aws:eks:us-west-2:111122223333:cluster/my-cluster
  project: default
```

以下のとおり設定を適用します。

```
kubectl apply -f local-cluster.yaml
```

**注記**  
Kubernetes API サーバー URL ではなく、`server` フィールドで EKS クラスター ARN を使用します。マネージド機能では、ARN でクラスターを識別する必要があります。デフォルトの `kubernetes.default.svc` はサポートされていません。

## リモートクラスターを登録する
<a name="_register_remote_clusters"></a>

リモートクラスターにデプロイするには:

 **ステップ 1: リモートクラスターにアクセスエントリを作成する** 

*region-code* はリモートクラスターがある AWS リージョンに置き換え、*remote-cluster* はリモートクラスターの名前に置き換え、ARN は Argo CD 機能ロール ARN に置き換えます。

```
aws eks create-access-entry \
  --region region-code \
  --cluster-name remote-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole \
  --type STANDARD
```

 **ステップ 2: アクセスポリシーを Kubernetes RBAC アクセス許可に関連付ける** 

アクセスエントリには、Argo CD がアプリケーションをデプロイするための Kubernetes RBAC アクセス許可が必要です。すぐに開始するには、`AmazonEKSClusterAdminPolicy` を使用できます。

```
aws eks associate-access-policy \
  --region region-code \
  --cluster-name remote-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
  --access-scope type=cluster
```

**重要**  
`AmazonEKSClusterAdminPolicy` は、完全なクラスター管理者アクセスを提供します (`system:masters` に相当)。これは開始するのに便利ですが、本番環境では使用しないでください。本番環境では、アクセスエントリをカスタム Kubernetes グループに関連付け、適切なロールバインディングまたはクラスターロールバインディングを作成することで、より制限の厳しいアクセス許可を使用してください。最小特権の設定については、以下の本番環境設定セクションを参照してください。

 **ステップ 3: Argo CD にクラスターを登録する** 

 **Argo CD CLI を使用する**:

```
argocd cluster add <cluster-context-name> \
  --aws-cluster-name arn:aws:eks:us-west-2:111122223333:cluster/remote-cluster \
  --name remote-cluster
```

 **Kubernetes シークレットを使用する**:

```
apiVersion: v1
kind: Secret
metadata:
  name: remote-cluster
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: cluster
stringData:
  name: remote-cluster
  server: arn:aws:eks:us-west-2:111122223333:cluster/remote-cluster
  project: default
```

以下のとおり設定を適用します。

```
kubectl apply -f remote-cluster.yaml
```

## クロスアカウントクラスター
<a name="_cross_account_clusters"></a>

さまざまな AWS アカウント内のクラスターにデプロイするには:

1. ターゲットアカウントで、ソースアカウントの Argo CD IAM 機能ロール ARN をプリンシパルとして使用して、ターゲット EKS クラスター上にアクセスエントリを作成します。

1. アクセスポリシーを適切な Kubernetes RBAC アクセス許可に関連付けします。

1. EKS クラスター ARN を使用して Argo CD にクラスターを登録します。

追加で IAM ロールを作成したり、信頼ポリシーを設定したりする必要はありません。EKS アクセスエントリがクロスアカウントアクセスを処理します。

クラスター ARN 形式にはリージョンが含まれているため、クロスリージョンデプロイでは同じリージョンデプロイと同じプロセスが使用されます。

## クラスター登録を検証する
<a name="_verify_cluster_registration"></a>

登録済みのクラスターを表示します。

```
kubectl get secrets -n argocd -l argocd.argoproj.io/secret-type=cluster
```

あるいは、Argo CD UI の [設定] → [クラスター] でクラスターステータスを確認します。

## プライベートクラスター
<a name="_private_clusters"></a>

Argo CD 機能では、VPC ピアリングや特殊なネットワーク設定を施すことなく、完全にプライベートな EKS クラスターに透過的にアクセスできます。

 AWS は、Argo CD 機能とプライベートリモートクラスターとの接続を自動的に管理します。

単に ARN を使用してプライベートクラスターを登録するだけで、別途ネットワークをセットアップする必要はありません。

## アクセスエントリの RBAC 要件
<a name="_access_entry_rbac_requirements"></a>

Argo CD 機能を作成すると、機能ロールに対して EKS アクセスエントリが自動的に作成されますが、デフォルトでは Kubernetes RBAC アクセス許可は付与されません。この設計は、最小特権の原則に従った意図的なものです。異なるユースケースには、異なるアクセス許可が必要となります。

例: \$1クラスターを Argo CD ハブとしてのみ使用してリモートクラスターを管理する場合、ローカルデプロイのアクセス許可は必要ありません。\$1アプリケーションをローカルにデプロイする場合は、クラスター全体の読み取りアクセスと特定の名前空間への書き込みアクセスが必要です。\$1CRD を作成する必要がある場合は、追加のクラスター管理者アクセス許可が必要です。

要件に基づいて Argo CD に必要なアクセス許可を明示的に設定する必要があります。

### Argo CD の最小アクセス許可
<a name="_minimum_permissions_for_argo_cd"></a>

Argo CD には、エラーなしで機能するために 2 種類のアクセス許可が必要です。

 **読み取りアクセス許可 (クラスター全体)**: Argo CD は以下のために、クラスター全体のすべてのリソースタイプとカスタムリソース定義 (CRD) を読み取ることができる必要があります。
+ リソース検出とヘルスチェック
+ 目的の状態と実際の状態の間のドリフトの検出
+ デプロイ前のリソースの検証

 **書き込みアクセス許可 (名前空間固有)**: Argo CD には、Application で定義されたリソースの作成、更新、削除のアクセス許可が必要です。
+ アプリケーションワークロード (デプロイ、サービス、ConfigMaps など) をデプロイする
+ カスタムリソースの適用 (アプリケーション固有の CRD)
+ アプリケーションのライフサイクルを管理する

### Quick Setup
<a name="_quick_setup"></a>

迅速な開始、テスト、または開発環境については、`AmazonEKSClusterAdminPolicy` を使用します。

```
aws eks associate-access-policy \
  --region region-code \
  --cluster-name my-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
  --access-scope type=cluster
```

**重要**  
`AmazonEKSClusterAdminPolicy` は、完全なクラスター管理者アクセス (`system:masters` に相当) を提供します。これには、CRD の作成、クラスター全体のリソースの変更、任意の名前空間へのデプロイが含まれます。これは開発や POC には便利ですが、本番環境では使用しないでください。本番環境では、以下の最小特権設定を使用します。

### 最小特権原則に基づく本番環境設定
<a name="_production_setup_with_least_privilege"></a>

本番環境では、以下を許可するカスタム Kubernetes RBAC を作成します。
+ すべてのリソースへのクラスター全体の読み取りアクセス (検出とヘルスチェック用)
+ 名前空間固有の書き込みアクセス (デプロイ用)

 **ステップ 1: アクセスエントリをカスタム Kubernetes グループに関連付ける** 

```
aws eks associate-access-policy \
  --region region-code \
  --cluster-name my-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSEditPolicy \
  --access-scope type=namespace,namespaces=app-namespace
```

 **ステップ 2: 読み取りアクセス用のクラスターロールを作成する** 

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: argocd-read-all
rules:
# Read access to all resources for discovery and health checks
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["get", "list", "watch"]
```

 **ステップ 3: アプリケーション名前空間への書き込みアクセス用ロールを作成する** 

```
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: argocd-deploy
  namespace: app-namespace
rules:
# Full access to deploy application resources
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
```

 **ステップ 4: ロールを Kubernetes グループにバインドする** 

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: argocd-read-all
subjects:
- kind: Group
  name: eks-access-entry:arn:aws:iam::111122223333:role/ArgoCDCapabilityRole
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: argocd-read-all
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: argocd-deploy
  namespace: app-namespace
subjects:
- kind: Group
  name: eks-access-entry:arn:aws:iam::111122223333:role/ArgoCDCapabilityRole
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: argocd-deploy
  apiGroup: rbac.authorization.k8s.io
```

**注記**  
アクセスエントリのグループ名形式は、`eks-access-entry:` の後にプリンシパル ARN が続きます。Argo CD がアプリケーションをデプロイする名前空間ごとに、このロールバインド手順を繰り返します。

**重要**  
Argo CD は、特定の名前空間にのみデプロイする場合でも、ヘルスチェックと検出のためにクラスター全体のすべてのリソースタイプを読み取ることができる必要があります。クラスター全体の読み取りアクセスがないと、アプリケーションの状態をチェックするときに Argo CD にエラーが表示されます。

## Project でクラスターアクセスを制限する
<a name="_restrict_cluster_access_with_projects"></a>

プロジェクトを使用して、`spec.destinations` で許可されるターゲットクラスターと名前空間を設定することで、Application がデプロイできるクラスターと名前空間を制御します。

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production
  namespace: argocd
spec:
  destinations:
  - server: arn:aws:eks:us-west-2:111122223333:cluster/prod-cluster
    namespace: '*'
  - server: arn:aws:eks:eu-west-1:111122223333:cluster/prod-eu-cluster
    namespace: '*'
  sourceRepos:
  - 'https://github.com/example/production-apps'
```

詳細については、「[Argo CD Project を操作する](argocd-projects.md)」を参照してください。

## その他のリソース
<a name="_additional_resources"></a>
+  [Argo CD Project を操作する](argocd-projects.md) - Application を整理し、セキュリティ境界を確立する
+  [Application を作成する](argocd-create-application.md) - 最初のアプリケーションをデプロイする
+  [ApplicationSet を使用する](argocd-applicationsets.md) - ApplicationSet で複数のクラスターにデプロイする
+  [Argo CD に関する考慮事項](argocd-considerations.md) - マルチクラスターパターンとクロスアカウントセットアップ
+  [宣言型クラスターセットアップ](https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#clusters) - アップストリームクラスター設定リファレンス

# Argo CD Project を操作する
<a name="argocd-projects"></a>

Argo CD Project (AppProject) では、Application を論理的にグループ化して、アクセスコントロールを付与できます。Project は、Application が使用できる Git リポジトリ、ターゲットクラスター、名前空間を定義して、共有 Argo CD インスタンスにマルチテナンシーとセキュリティの境界を確立します。

## どのような場合に Project を使用するか
<a name="_when_to_use_projects"></a>

Project を使用すると、以下のことが行えます。
+ チーム、環境、またはビジネスユニットごとに Application を分離します。
+ チームがどのリポジトリからデプロイできるかを制限します。
+ チームがどのクラスターと名前空間にデプロイできるかを制限します。
+ リソースクォータと許可されたリソースタイプを適用します。
+ ガードレールに沿ってセルフサービスアプリケーションをデプロイします。

## default Project
<a name="_default_project"></a>

すべての Argo CD 機能に `default` Project があり、すべてのリポジトリ、クラスター、名前空間へのアクセスを許可する設定になっています。初期テストには有用ですが、本番稼働に使用する場合は制限を明記した専用の Project を作成します。

default Project の設定とその制限方法の詳細については、Argo CD ドキュメントの「[default Project ](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#the-default-project)」を参照してください。

## プロジェクトの作成
<a name="_create_a_project"></a>

Project を作成するには、クラスターに `AppProject` リソースを適用します。

 **例: チーム固有の Project** 

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  description: Applications for Team A

  # Source repositories this project can deploy from
  sourceRepos:
    - 'https://github.com/my-org/team-a-*'
    - 'https://github.com/my-org/shared-libs'

  # Destination clusters and namespaces
  destinations:
    - name: dev-cluster
      namespace: team-a-dev
    - name: prod-cluster
      namespace: team-a-prod

  # Allowed resource types
  clusterResourceWhitelist:
    - group: ''
      kind: Namespace

  namespaceResourceWhitelist:
    - group: 'apps'
      kind: Deployment
    - group: ''
      kind: Service
    - group: ''
      kind: ConfigMap
```

Project を適用します。

```
kubectl apply -f team-a-project.yaml
```

## プロジェクトの設定
<a name="_project_configuration"></a>

### ソースリポジトリ
<a name="_source_repositories"></a>

この Project の Application が使用できる Git リポジトリを制御します。

```
spec:
  sourceRepos:
    - 'https://github.com/my-org/app-*'  # Wildcard pattern
    - 'https://github.com/my-org/infra'  # Specific repo
```

ワイルドカードと否定パターン (`!` プレフィックス) を使用すると、特定のリポジトリを許可または拒否できます。詳細については、Argo CD ドキュメントの「[Project の管理](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#managing-projects)」を参照してください。

### 送信先の制限
<a name="_destination_restrictions"></a>

Application がデプロイできる場所を制限します。

```
spec:
  destinations:
    - name: prod-cluster  # Specific cluster by name
      namespace: production
    - name: '*'  # Any cluster
      namespace: team-a-*  # Namespace pattern
```

**重要**  
本番稼働の Project では、ワイルドカードではなく、特定のクラスター名と名前空間パターンを使用します。これにより、不正なクラスターや名前空間が偶発的にデプロイされるのを防ぐことができます。

ワイルドカードと否定パターンを使用して、送信先を制御できます。詳細については、Argo CD ドキュメントの「[Project の管理](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#managing-projects)」を参照してください。

### リソースの制限
<a name="_resource_restrictions"></a>

どの Kubernetes リソースタイプをデプロイできるかを制御します。

 **クラスター範囲のリソース**:

```
spec:
  clusterResourceWhitelist:
    - group: ''
      kind: Namespace
    - group: 'rbac.authorization.k8s.io'
      kind: Role
```

 **名前空間範囲のリソース**:

```
spec:
  namespaceResourceWhitelist:
    - group: 'apps'
      kind: Deployment
    - group: ''
      kind: Service
    - group: ''
      kind: ConfigMap
    - group: 's3.services.k8s.aws'
      kind: Bucket
```

ブラックリストを使用して、特定のリソースを拒否します。

```
spec:
  namespaceResourceBlacklist:
    - group: ''
      kind: Secret  # Prevent direct Secret creation
```

## Project に Application を割り当てる
<a name="_assign_applications_to_projects"></a>

Application を作成するときは、`spec.project` フィールドに Project を指定します。

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: team-a  # Assign to team-a project
  source:
    repoURL: https://github.com/my-org/my-app
    path: manifests
  destination:
    name: prod-cluster
    namespace: team-a-prod
```

Application に Project を指定しないと、`default` Project が使用されます。

## Project のロールと RBAC
<a name="_project_roles_and_rbac"></a>

Project では、カスタムロールを定義して、アクセスコントロールをきめ細かく設定できます。機能設定で Project のロールを AWS アイデンティティセンターのユーザーとグループにマッピングすると、アプリケーションを同期、更新、または削除できるユーザーを制御できます。

 **例: Project に開発者ロールと管理者ロールを付与する** 

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  sourceRepos:
    - '*'
  destinations:
    - name: '*'
      namespace: 'team-a-*'

  roles:
    - name: developer
      description: Developers can sync applications
      policies:
        - p, proj:team-a:developer, applications, sync, team-a/*, allow
        - p, proj:team-a:developer, applications, get, team-a/*, allow
      groups:
        - team-a-developers

    - name: admin
      description: Admins have full access
      policies:
        - p, proj:team-a:admin, applications, *, team-a/*, allow
      groups:
        - team-a-admins
```

Project のロール、CI/CD パイプラインの JWT トークン、および RBAC 設定の詳細については、Argo CD ドキュメントの「[Project のロール](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#project-roles)」を参照してください。

## 一般的なパターン
<a name="_common_patterns"></a>

### 環境ベースの Project
<a name="_environment_based_projects"></a>

環境ごとに Project を作成します。

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production
  namespace: argocd
spec:
  sourceRepos:
    - 'https://github.com/my-org/*'
  destinations:
    - name: prod-cluster
      namespace: '*'
  # Strict resource controls for production
  clusterResourceWhitelist: []
  namespaceResourceWhitelist:
    - group: 'apps'
      kind: Deployment
    - group: ''
      kind: Service
```

### チームベースの Project
<a name="_team_based_projects"></a>

専用の Project でチームを分離します。

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: platform-team
  namespace: argocd
spec:
  sourceRepos:
    - 'https://github.com/my-org/platform-*'
  destinations:
    - name: '*'
      namespace: 'platform-*'
  # Platform team can manage cluster resources
  clusterResourceWhitelist:
    - group: '*'
      kind: '*'
```

### マルチクラスターの Project
<a name="_multi_cluster_projects"></a>

ポリシーに一貫性のある複数のクラスターにデプロイします。

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: global-app
  namespace: argocd
spec:
  sourceRepos:
    - 'https://github.com/my-org/global-app'
  destinations:
    - name: us-west-cluster
      namespace: app
    - name: eu-west-cluster
      namespace: app
    - name: ap-south-cluster
      namespace: app
```

## ベストプラクティス
<a name="_best_practices"></a>

 **制限のある Project から始める**: 最初から幅広いアクセスを付与するのではなく、絞り込んだアクセス許可から始め、必要に応じて拡張します。

 **名前空間パターンを使用する**: 名前空間の制限 (`team-a-*` など) にワイルドカードを活用して、境界を維持しながら柔軟性を確保します。

 **本番稼働用の Project を分離する**: 本番稼働専用の Project を使用する場合は、制御を厳格にし、手動同期ポリシーを実施します。

 **Project の目的を文書化する**: `description` フィールドを使用して、各 Project の目的と誰が使用すべきかを説明します。

 **Project のアクセス許可を定期的に見直す**: Project を定期的に監査して、制限がチームのニーズとセキュリティ要件に沿っていることを確認します。

## その他のリソース
<a name="_additional_resources"></a>
+  [Argo CD アクセス許可を設定する](argocd-permissions.md) - RBAC とアイデンティティセンターとの統合を設定する
+  [Application を作成する](argocd-create-application.md) - Project 内に Application を作成する
+  [ApplicationSet を使用する](argocd-applicationsets.md) - Project で ApplicationSet を使用してマルチクラスターデプロイを実施する
+  [Argo CD Project ドキュメント](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/) - 詳細なアップストリームリファレンス

# Application を作成する
<a name="argocd-create-application"></a>

Application は、ターゲットクラスター内のデプロイを表します。Application ごとに、ソース (Git リポジトリ) と宛先 (クラスターと名前空間) を定義します。適用すると、Argo CD は Git リポジトリのマニフェストで指定されたリソースをクラスター内の名前空間に作成します。Application では、ワークロードのデプロイを指定することが多くなるものの、送信先クラスターで使用可能な Kubernetes リソースを管理することもできます。

## 前提条件
<a name="_prerequisites"></a>
+ EKS クラスターに Argo CD 機能が作成されていること
+ リポジトリアクセスが設定されていること (「[リポジトリアクセスを設定する](argocd-configure-repositories.md)」を参照)
+ ターゲットクラスターが登録されていること (「[ターゲットクラスターを登録する](argocd-register-clusters.md)」を参照)
+  クラスターと通信できるように `kubectl` が設定されていること

## 基本的な Application を作成する
<a name="_create_a_basic_application"></a>

Git リポジトリからデプロイする Application を定義します。

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps
    targetRevision: HEAD
    path: guestbook
  destination:
    name: in-cluster
    namespace: default
```

**注記**  
クラスターの登録時に使用したクラスター名で `destination.name` を使用します (ローカルクラスターの `in-cluster` の場合など)。`destination.server` フィールドは EKS クラスター ARN でも機能しますが、読みやすくするためにクラスター名を使用することをお勧めします。

Application を適用します。

```
kubectl apply -f application.yaml
```

アプリケーションのステータスを表示します。

```
kubectl get application guestbook -n argocd
```

## ソース設定
<a name="_source_configuration"></a>

 **Git リポジトリ**:

```
spec:
  source:
    repoURL: https://github.com/example/my-app
    targetRevision: main
    path: kubernetes/manifests
```

 **特定の Git タグまたはコミット**:

```
spec:
  source:
    targetRevision: v1.2.0  # or commit SHA
```

 **Helm チャート**:

```
spec:
  source:
    repoURL: https://github.com/example/helm-charts
    targetRevision: main
    path: charts/my-app
    helm:
      valueFiles:
      - values.yaml
      parameters:
      - name: image.tag
        value: v1.2.0
```

 **外部 Git リポジトリの値を含む Helm チャート** (マルチソースパターン):

```
spec:
  sources:
  - repoURL: https://github.com/example/helm-charts
    targetRevision: main
    path: charts/my-app
    helm:
      valueFiles:
      - $values/environments/production/values.yaml
  - repoURL: https://github.com/example/config-repo
    targetRevision: main
    ref: values
```

詳細については、Argo CD ドキュメントの「[Helm Value Files from External Git Repository](https://argo-cd.readthedocs.io/en/stable/user-guide/multiple_sources/#helm-value-files-from-external-git-repository)」を参照してください。

 **ECR Helm チャート**:

```
spec:
  source:
    repoURL: oci://account-id.dkr.ecr.region.amazonaws.com/repository-name
    targetRevision: chart-version
    chart: chart-name
```

機能ロールに必要な ECR アクセス許可がある場合、リポジトリが直接使用されるため、リポジトリ設定は必要ありません。詳細については、「[リポジトリアクセスを設定する](argocd-configure-repositories.md)」を参照してください。

 **CodeCommit の Git リポジトリ**:

```
spec:
  source:
    repoURL: https://git-codecommit.region.amazonaws.com/v1/repos/repository-name
    targetRevision: main
    path: kubernetes/manifests
```

機能ロールに必要な CodeCommit アクセス許可がある場合、リポジトリが直接使用されるため、リポジトリ設定は必要ありません。詳細については、「[リポジトリアクセスを設定する](argocd-configure-repositories.md)」を参照してください。

 **CodeConnections の Git リポジトリ**:

```
spec:
  source:
    repoURL: https://codeconnections.region.amazonaws.com/git-http/account-id/region/connection-id/owner/repository.git
    targetRevision: main
    path: kubernetes/manifests
```

リポジトリ URL 形式は、CodeConnections 接続 ARN から取得されます。機能ロールに必要な CodeConnections アクセス許可があり、接続が設定されている場合、リポジトリが直接使用されるため、リポジトリ設定は必要ありません。詳細については、「[リポジトリアクセスを設定する](argocd-configure-repositories.md)」を参照してください。

 **Kustomize**:

```
spec:
  source:
    repoURL: https://github.com/example/kustomize-app
    targetRevision: main
    path: overlays/production
    kustomize:
      namePrefix: prod-
```

## 同期ポリシー
<a name="_sync_policies"></a>

Argo CD によるアプリケーション同期の方法を制御します。

 **手動同期 (デフォルト)**:

アプリケーションを同期するには、手動による承認が必要です。

```
spec:
  syncPolicy: {}  # No automated sync
```

手動で同期をトリガーします。

```
kubectl patch application guestbook -n argocd \
  --type merge \
  --patch '{"operation": {"initiatedBy": {"username": "admin"}, "sync": {}}}'
```

 **自動同期**:

アプリケーションは、Git の変更が検出されたら自動的に同期します。

```
spec:
  syncPolicy:
    automated: {}
```

 **自己修復**:

クラスターに手動で加えられた変更を自動的に元に戻します。

```
spec:
  syncPolicy:
    automated:
      selfHeal: true
```

有効にすると、Argo CD はクラスターに手動で直接加えられた変更を元に戻して、Git を信頼できるソースとして維持します。

 **プルーニング**:

Git から除去されたリソースを自動的に削除します。

```
spec:
  syncPolicy:
    automated:
      prune: true
```

**警告**  
プルーニングにより、クラスターからリソースが削除されます。本番稼働環境での使用には注意が必要です。

 **自動同期を組み合わせる**:

```
spec:
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
```

 **再試行設定**:

失敗した同期の再試行動作を設定します。

```
spec:
  syncPolicy:
    retry:
      limit: 5  # Number of failed sync attempts; unlimited if less than 0
      backoff:
        duration: 5s  # Amount to back off (default unit: seconds, also supports "2m", "1h")
        factor: 2  # Factor to multiply the base duration after each failed retry
        maxDuration: 3m  # Maximum amount of time allowed for the backoff strategy
```

これは、最初に作成される CRD に依存するリソースや、CRD がすぐに利用できない可能性がある kro インスタンスを操作する場合に特に便利です。

## 同期オプション
<a name="_sync_options"></a>

追加の同期設定:

 **名前空間が存在しない場合には作成する**:

```
spec:
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
```

 **リソースが見つからない場合は、ドライランをスキップする**:

まだ存在しない CRD (kro インスタンスなど) に依存するリソースを適用する場合に便利です。

```
spec:
  syncPolicy:
    syncOptions:
    - SkipDryRunOnMissingResource=true
```

これは、リソース自体のラベルを使用して特定のリソースに適用することもできます。

 **適用する前にリソースを検証する**:

```
spec:
  syncPolicy:
    syncOptions:
    - Validate=true
```

 **同期が取れていない場合にのみ適用する**:

```
spec:
  syncPolicy:
    syncOptions:
    - ApplyOutOfSyncOnly=true
```

## 高度な同期機能
<a name="_advanced_sync_features"></a>

Argo CD では、複雑なデプロイ向けに高度な同期機能をサポートしています。
+  **同期ウェーブ** - `argocd.argoproj.io/sync-wave` 注釈を使用してリソースの作成順序を制御します。
+  **同期フック** - `argocd.argoproj.io/hook` 注釈を使用して同期の前後にジョブを実行します (PreSync、PostSync、SyncFail)
+  **リソースのヘルス評価** - アプリケーションに固有のリソースのカスタムヘルスチェックです。

詳細については、Argo CD ドキュメントの「[同期ウェーブ](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/)」と「[リソースフック](https://argo-cd.readthedocs.io/en/stable/user-guide/resource_hooks/)」を参照してください。

## 差分を無視する
<a name="_ignore_differences"></a>

Argo CD が他のコントローラー (HPA 管理レプリカなど) で管理されている特定のフィールドを同期しないようにします。

```
spec:
  ignoreDifferences:
  - group: apps
    kind: Deployment
    jsonPointers:
    - /spec/replicas
```

無視パターンとフィールド除外の詳細については、Argo CD ドキュメントの「[差分比較のカスタマイズ](https://argo-cd.readthedocs.io/en/stable/user-guide/diffing/)」を参照してください。

## マルチ環境デプロイ
<a name="_multi_environment_deployment"></a>

複数の環境に同じアプリケーションをデプロイします。

 **開発**:

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-dev
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/my-app
    targetRevision: develop
    path: overlays/development
  destination:
    name: dev-cluster
    namespace: my-app
```

 **本番稼働**:

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-prod
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/my-app
    targetRevision: main
    path: overlays/production
  destination:
    name: prod-cluster
    namespace: my-app
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
```

## Application をモニタリングおよび管理する
<a name="_monitor_and_manage_applications"></a>

 **アプリケーションのステータスを表示する**:

```
kubectl get application my-app -n argocd
```

 **Argo CD UI にアクセスする**:

EKS コンソールから Argo CD UI を開いて、アプリケーションのトポロジ、同期ステータス、リソースヘルス、デプロイ履歴を表示します。UI アクセスの手順については、「[Argo CD の使用](working-with-argocd.md)」を参照してください。

 **Application をロールバックする**:

以前のリビジョンにロールバックするには、Argo CD UI、Argo CD CLI を使用するか、Application 仕様の `targetRevision` を以前の Git コミットまたはタグに更新します。

Argo CD CLI を使用する:

```
argocd app rollback argocd/my-app <revision-id>
```

**注記**  
マネージド機能で Argo CD CLI を使用する場合は、名前空間プレフィックス `namespace/appname` を使用してアプリケーションを指定します。

詳細は、Argo CD ドキュメントの「[argocd app rollback](https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd_app_rollback/)」を参照してください。

## その他のリソース
<a name="_additional_resources"></a>
+  [Argo CD Project を操作する](argocd-projects.md) - Project でマルチテナント環境向けの Application を整理する
+  [ApplicationSet を使用する](argocd-applicationsets.md) - テンプレートで複数のクラスターにデプロイする
+  [Application 仕様](https://argo-cd.readthedocs.io/en/stable/user-guide/application-specification/) - 詳細なアプリケーション API リファレンス
+  [同期オプション](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-options/) - 高度な同期設定

# ApplicationSet を使用する
<a name="argocd-applicationsets"></a>

ApplicationSet によりテンプレートから複数の Application が生成されるため、単一のリソース定義で複数のクラスター、環境、または名前空間に同じアプリケーションをデプロイできます。

## 前提条件
<a name="_prerequisites"></a>
+ EKS クラスターに Argo CD 機能が作成されていること
+ リポジトリアクセスが設定されていること (「[リポジトリアクセスを設定する](argocd-configure-repositories.md)」を参照)
+  クラスターと通信できるように `kubectl` が設定されていること

**注記**  
ApplicationSet には複数のターゲットクラスターは必要ありません。クラスタージェネレーター以外のジェネレーター (リスト、git、マトリックスジェネレーターなど) を使用して、リモートクラスターなしでアプリケーションをデプロイできます。

## ApplicationSet の仕組み
<a name="_how_applicationsets_work"></a>

ApplicationSet は、ジェネレーターを使用してパラメータを生成し、生成したパラメータを Application テンプレートに適用します。生成したパラメータのセットごとに Application が 1 つ作成されます。

EKS のデプロイによく使用されるジェネレーター:
+  **リストジェネレーター** - 環境ごとにクラスターとパラメータを明示的に定義します。
+  **クラスタージェネレーター** - 登録されたすべてのクラスターに自動的にデプロイします。
+  **Git ジェネレーター** - リポジトリ構造から Application を生成します。
+  **マトリックスジェネレーター** - 多次元デプロイ用にいくつかジェネレーターを組み合わせます。
+  **マージジェネレーター** – 複数のジェネレーターからのパラメータをマージします。

ジェネレーターの詳細なリファレンスについては、「[ApplicationSet ドキュメント](https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/)」を参照してください。

## リストジェネレーター
<a name="_list_generator"></a>

複数のクラスターにデプロイするように明示的に設定します。

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook-all-clusters
  namespace: argocd
spec:
  generators:
  - list:
      elements:
      - environment: dev
        replicas: "2"
      - environment: staging
        replicas: "3"
      - environment: prod
        replicas: "5"
  template:
    metadata:
      name: 'guestbook-{{environment}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/guestbook
        targetRevision: HEAD
        path: 'overlays/{{environment}}'
      destination:
        name: '{{environment}}-cluster'
        namespace: guestbook
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
```

**注記**  
読みやすくするために、`destination.name` をクラスター名と合わせて使用します。`destination.server` フィールドは、必要に応じて EKS クラスター ARN とも連携します。

これにより、`guestbook-dev`、`guestbook-staging`、`guestbook-prod` の 3 つの Application が作成されます。

## クラスタージェネレーター
<a name="_cluster_generator"></a>

登録済みのすべてのクラスターに自動的にデプロイします。

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: cluster-addons
  namespace: argocd
spec:
  generators:
  - clusters: {}
  template:
    metadata:
      name: '{{name}}-addons'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/cluster-addons
        targetRevision: HEAD
        path: addons
      destination:
        server: '{{server}}'
        namespace: kube-system
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
```

これにより、登録済みのクラスターごとに Application が自動的に作成されます。

 **クラスターをフィルタリングする**:

`matchLabels` を使用して特定のクラスターを含めるか、`matchExpressions` を使用してクラスターを除外します。

```
spec:
  generators:
  - clusters:
      selector:
        matchLabels:
          environment: production
        matchExpressions:
        - key: skip-appset
          operator: DoesNotExist
```

## Git ジェネレーター
<a name="_git_generators"></a>

Git ジェネレーターは、リポジトリ構造に基づいて Application を作成します。
+  **ディレクトリジェネレーター** - 各ディレクトリを個別の Application としてデプロイします (マイクロサービスに有用です)。
+  **ファイルジェネレーター** - パラメータファイルから Application を生成します (マルチテナントデプロイに有用です)。

 **例: マイクロサービスのデプロイ** 

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: microservices
  namespace: argocd
spec:
  generators:
  - git:
      repoURL: https://github.com/example/microservices
      revision: HEAD
      directories:
      - path: services/*
  template:
    metadata:
      name: '{{path.basename}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/microservices
        targetRevision: HEAD
        path: '{{path}}'
      destination:
        name: my-cluster
        namespace: '{{path.basename}}'
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        syncOptions:
        - CreateNamespace=true
```

Git ジェネレーターとファイルベースの設定の詳細については、Argo CD ドキュメントの「[Git ジェネレーター](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators-Git/)」を参照してください。

## マトリックスジェネレーター
<a name="_matrix_generator"></a>

複数のジェネレーターを組み合わせて、複数のディメンション (環境 × クラスター) にデプロイします。

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: multi-env-multi-cluster
  namespace: argocd
spec:
  generators:
  - matrix:
      generators:
      - list:
          elements:
          - environment: dev
          - environment: staging
          - environment: prod
      - clusters:
          selector:
            matchLabels:
              region: us-west-2
  template:
    metadata:
      name: 'app-{{environment}}-{{name}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/app
        targetRevision: HEAD
        path: 'overlays/{{environment}}'
      destination:
        name: '{{name}}'
        namespace: 'app-{{environment}}'
```

ジェネレーターを組み合わせる方法の詳細については、Argo CD ドキュメントの「[マトリックスジェネレーター](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators-Matrix/)」を参照してください。

## マルチリージョンデプロイ
<a name="_multi_region_deployment"></a>

複数のリージョンでクラスターにデプロイします。

```
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: global-app
  namespace: argocd
spec:
  generators:
  - list:
      elements:
      - clusterName: prod-us-west
        region: us-west-2
      - clusterName: prod-us-east
        region: us-east-1
      - clusterName: prod-eu-west
        region: eu-west-1
  template:
    metadata:
      name: 'app-{{region}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/example/app
        targetRevision: HEAD
        path: kubernetes
        helm:
          parameters:
          - name: region
            value: '{{region}}'
      destination:
        name: '{{clusterName}}'
        namespace: app
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
```

## ApplicationSet を管理する
<a name="_manage_applicationsets"></a>

 **ApplicationSet と生成された Application を表示する**:

```
kubectl get applicationsets -n argocd
kubectl get applications -n argocd -l argocd.argoproj.io/application-set-name=<applicationset-name>
```

 **ApplicationSet を更新する**:

ApplicationSet の仕様を変更して再適用します。Argo CD は、生成したすべての Application を自動的に更新します。

```
kubectl apply -f applicationset.yaml
```

 **ApplicationSet を削除する**:

```
kubectl delete applicationset <name> -n argocd
```

**警告**  
ApplicationSet を削除すると、生成されたすべての Application も削除されます。削除対象の Application に `prune: true` がある場合、そのリソースもターゲットクラスターから削除されます。  
ApplicationSet を削除するときにデプロイされたリソースを保持するには、ApplicationSet 仕様で `.syncPolicy.preserveResourcesOnDeletion` を `true` に設定します。詳細は、Argo CD ドキュメントの「[Application Pruning & Resource Deletion](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Application-Deletion/)」を参照してください。

**重要**  
Argo CD の ApplicationSet 機能には、ApplicationSet を使用する前に注意すべきセキュリティ上の考慮事項があります。詳細は、Argo CD ドキュメントの「[ApplicationSet Security](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Security/)」を参照してください。

## その他のリソース
<a name="_additional_resources"></a>
+  [Argo CD Project を操作する](argocd-projects.md) - Project で ApplicationSet を整理する
+  [Application を作成する](argocd-create-application.md) - Application 設定を理解する
+  [ApplicationSet ドキュメント](https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/) - ジェネレーターの詳細なリファレンスとパターン
+  [ジェネレーターのリファレンス](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators/) - ジェネレーターの詳細な仕様

# Argo CD に関する考慮事項
<a name="argocd-considerations"></a>

このトピックでは、EKS Capability for Argo CD を使用する際の重要な考慮事項を示します。具体的には、計画、アクセス許可、認証、マルチクラスターデプロイパターンなどです。

## 計画
<a name="_planning"></a>

Argo CD をデプロイする前に、以下の点を考慮してください。

 **リポジトリ戦略**: アプリケーションマニフェストの保存場所を決定します (CodeCommit、GitHub、GitLab、Bitbucket)。異なる環境ごとにリポジトリ構造と分岐戦略を計画します。

 **RBAC 戦略**: どのチームやユーザーが管理者、編集者、またはビューワーのアクセス権を持つべきかを計画します。これらを AWS アイデンティティセンターグループまたは Argo CD ロールにマッピングします。

 **マルチクラスターアーキテクチャ**: 単一の Argo CD インスタンスから複数のクラスターを管理するかどうかを決定します。Argo CD に専用の管理クラスターを使用することを検討してください。

 **Application の編成**: Application と ApplicationSet をどのように構造化するかを計画します。Project を使用してチームや環境ごとに Application を編成することを検討してください。

 **同期ポリシー**: アプリケーションを自動的に同期するか、手動で承認するかを決定します。開発環境では自動同期が一般的ですが、本番稼働環境では手動で同期します。

## アクセス許可
<a name="_permissions"></a>

IAM 機能ロール、信頼ポリシー、セキュリティベストプラクティスの詳細については、「[Amazon EKS 機能 IAM ロール](capability-role.md)」および「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

### IAM 機能ロールの概要
<a name="_iam_capability_role_overview"></a>

Argo CD 機能リソースを作成するときに、IAM 機能ロールを指定できます。ACK とは異なり、Argo CD は主に Kubernetes リソースを管理し、AWS リソースを直接には管理しません。一方、次の場合には IAM 機能ロールが必要です。
+ CodeCommit でプライベート Git リポジトリにアクセスする場合
+ 認証のために AWS アイデンティティセンターと統合する場合
+ AWS Secrets Manager でシークレットにアクセスする場合 (設定されている場合)
+ 他の EKS クラスターにクロスクラスターでデプロイする場合

### CodeCommit 統合
<a name="_codecommit_integration"></a>

CodeCommit リポジトリを使用している場合は、読み取りアクセス許可を付与したポリシーをアタッチします。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "codecommit:GitPull"
      ],
      "Resource": "*"
    }
  ]
}
```

**重要**  
本番稼働で使用する場合は、`"*"` を使用する代わりに、`Resource` フィールドを特定のリポジトリ ARN に制限します。  
例:  

```
"Resource": "arn:aws:codecommit:us-west-2:111122223333:my-app-repo"
```
これにより、Argo CD 機能のアクセスが要管理のリポジトリにのみ制限されます。

### Secrets Manager の統合
<a name="_secrets_manager_integration"></a>

Secrets Manager にリポジトリ認証情報を保存する場合は、読み取りアクセスのマネージドポリシーをアタッチします。

```
arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess
```

このポリシーには、`secretsmanager:GetSecretValue`、`secretsmanager:DescribeSecret`、および KMS 復号アクセス許可という必要なアクセス許可が含まれています。

### 基本セットアップ
<a name="_basic_setup"></a>

基本的な Argo CD 機能にパブリック Git リポジトリがある場合、信頼ポリシー以外に追加の IAM ポリシーは必要ありません。

## 認証
<a name="_authentication"></a>

### AWS アイデンティティセンターの統合
<a name="shared_aws_identity_center_integration"></a>

Argo CD マネージド機能を AWS アイデンティティセンター (以前の AWS SSO) と直接統合すると、認証に既存の ID プロバイダーを使用できます。

AWS アイデンティティセンター統合を設定した場合:

1. ユーザーは、EKS コンソールから Argo CD UI にアクセスします。

1. AWS アイデンティティセンターを使用してユーザーが認証されます (社内の ID プロバイダーにフェデレーションできます)。

1.  AWS アイデンティティセンターは、ユーザーとグループの情報を Argo CD に提供します。

1. Argo CD は、現在の設定に基づいてユーザーとグループを RBAC ロールにマッピングします。

1. ユーザーには、自分がアクセス許可を持つアプリケーションとリソースのみが表示されます。

### アイデンティティセンターアクセス許可セットでアクセスをシンプルにする
<a name="_simplifying_access_with_identity_center_permission_sets"></a>

 AWS アイデンティティセンターでは、Argo CD を使用する際に以下の 2 種類の認証パスを利用できます。

 **Argo CD API 認証**: アイデンティティセンターにより、Argo CD UI と API から SSO 認証を行うことができます。これを設定するには、Argo CD 機能の RBAC ロールマッピングを使用します。

 **EKS クラスターアクセス**: Argo CD 機能は、お客様提供の IAM ロールを使用して、アクセスエントリを基に EKS クラスターで認証します。こうしたアクセスエントリは、アクセス許可を追加または削除するように手動で設定できます。

[アイデンティティセンターアクセス許可セット](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtocreatepermissionset.html)を使用すると、単一の ID で Argo CD クラスターと EKS クラスターの両方にアクセスできるため、ID 管理がシンプルになります。Argo CD アクセス用とクラスターアクセス用の認証情報を別々に維持するのではなく、両方のシステムで 1 つの ID だけを管理すればよいので、オーバーヘッドが軽減されます。

### RBAC ロールマッピング
<a name="_rbac_role_mappings"></a>

Argo CD には、AWS アイデンティティセンターのユーザーとグループにマッピングできるロールが組み込まれています。

 **ADMIN**: すべてのアプリケーションと設定にフルアクセスできます。アプリケーションの作成、デプロイ、更新、削除が可能です。Argo CD の設定を管理できます。

 **EDITOR**: アプリケーションを作成および変更できます。Argo CD の設定を変更したり、アプリケーションを削除したりすることはできません。

 **VIEWER**: アプリケーションに読み取り専用でアクセスできます。アプリケーションのステータスおよび履歴を表示できます。変更を加えることはできません。

**注記**  
ロール名は、大文字と小文字が区別され、大文字 (ADMIN、EDITOR、VIEWER) にする必要があります。

**重要**  
EKS 機能と AWS アイデンティティセンターが統合されている場合、Argo CD 機能あたり最大 1,000 個の ID がサポートされます。ユーザーやグループを ID にすることができます。

## マルチクラスターデプロイ
<a name="_multi_cluster_deployments"></a>

Argo CD マネージド機能は、マルチクラスターデプロイをサポートしているため、単一の Argo CD インスタンスから開発、ステージング、本番稼働のクラスター全体にわたってアプリケーションを管理できます。

### マルチクラスターの仕組み
<a name="_how_multi_cluster_works"></a>

Argo CD に追加でクラスターを登録する場合:

1. ARN でターゲット EKS クラスターを参照するクラスターシークレットを作成します。

1. ターゲットが異なるクラスターごとに Application または ApplicationSet を作成します。

1. Argo CD は、各クラスターに接続してデプロイし、リソースを監視する

1. 単一の Argo CD UI からすべてのクラスターを表示して管理します。

### マルチクラスターの前提条件
<a name="_prerequisites_for_multi_cluster"></a>

追加でクラスターを登録する前に:
+ ターゲットクラスターで Argo CD 機能ロールのアクセスエントリを作成すること
+ Argo CD 機能とターゲットクラスターとの間にネットワーク接続を確保すること
+ ターゲットクラスターにアクセスするための IAM アクセス許可を検証すること

### クラスターを登録する
<a name="_register_a_cluster"></a>

Kubernetes シークレットを使用して `argocd` 名前空間にクラスターを登録します。

ターゲットクラスター ARN を取得します。*region-code* はターゲットクラスターがある AWS リージョンに置き換え、*my-cluster* はターゲットクラスターの名前に置き換えます。

```
aws eks describe-cluster \
  --region region-code \
  --name target-cluster \
  --query 'cluster.arn' \
  --output text
```

クラスター ARN を使用して、クラスターシークレットを作成します。

```
apiVersion: v1
kind: Secret
metadata:
  name: target-cluster
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
  name: target-cluster
  server: arn:aws:eks:us-west-2:111122223333:cluster/target-cluster
  project: default
```

**重要**  
Kubernetes API サーバー URL ではなく、`server` フィールドで EKS クラスター ARN を使用します。マネージド機能では、ARN でターゲットクラスターを識別する必要があります。

シークレットを適用します。

```
kubectl apply -f cluster-secret.yaml
```

### ターゲットクラスターでアクセスエントリを設定する
<a name="_configure_access_entry_on_target_cluster"></a>

アプリケーションのデプロイに必要なアクセス許可を Argo CD 機能ロールに付与するには、ターゲットクラスターでアクセスエントリを設定する必要があります。*region-code* はターゲットクラスターがある AWS リージョンに置き換え、*target-cluster* はターゲットクラスターの名前に置き換え、ARN は Argo CD 機能ロール ARN に置き換えます。

```
aws eks create-access-entry \
  --region region-code \
  --cluster-name target-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/ArgoCDCapabilityRole \
  --type STANDARD \
  --kubernetes-groups system:masters
```

**注記**  
本番稼働で使用する場合は、`system:masters` ではなくより制限の厳しい Kubernetes グループを使用することを検討してください。

### プライベートクラスターアクセス
<a name="_private_cluster_access"></a>

Argo CD マネージド機能では、VPC ピアリングや特殊なネットワーク設定を施すことなく、完全にプライベートな EKS クラスターにデプロイできます。AWS が Argo CD 機能とプライベートリモートクラスターとの接続を自動的に管理します。リポジトリのアクセスコントロールと Argo CD RBAC ポリシーが正しく設定されていることを確認します。

### クロスアカウントデプロイ
<a name="_cross_account_deployments"></a>

クロスアカウントデプロイの場合は、ソースアカウントの Argo CD IAM 機能ロールをターゲットクラスターの EKS アクセスエントリに追加します。

1. ターゲットアカウントでは、ターゲット EKS クラスターにアクセスエントリを作成します。

1. ソースアカウントの Argo CD IAM 機能ロール ARN をプリンシパルとして使用します。

1. アクセスエントリに適切な Kubernetes RBAC アクセス許可を設定します。

1. EKS クラスター ARN を使用して Argo CD にターゲットクラスターを登録します。

追加で IAM ロールを作成したり、信頼ポリシーを設定したりする必要はありません。EKS アクセスエントリがクロスアカウントアクセスを処理します。

## ベストプラクティス
<a name="_best_practices"></a>

 **宣言型ソースを信頼できるソースとして使用する**: すべてのアプリケーションマニフェストを宣言型ソース (Git リポジトリ、Helm レジストリ、または OCI イメージ) に保存して、バージョン管理、監査証跡、およびコラボレーションを有効にできます。

 **適切な RBAC を実装する**: AWS アイデンティティセンター統合を使用すると、Argo CD でアプリケーションにアクセスして管理できるユーザーを制御できます。Argo CD では、Application 内のリソース (デプロイ、ポッド、ConfigMap、シークレット) へのアクセスをきめ細かく制御できます。

 **マルチ環境デプロイに ApplicationSet を使用する**: ApplicationSet を使用すると、設定が異なる複数のクラスターまたは名前空間にアプリケーションをデプロイできます。

## ライフサイクル管理
<a name="_lifecycle_management"></a>

### アプリケーション同期ポリシー
<a name="_application_sync_policies"></a>

Argo CD によるアプリケーション同期の方法を制御します。

 **手動同期**: アプリケーションで変更を同期するには、手動承認が必要です。**本番稼働**環境に推奨されます。

 **自動同期**: Git での変更が検出されると、アプリケーションが自動的に同期します。開発環境とステージング環境でよく使用されます。

 **自己修復**: クラスターに手動で加えられた変更を自動的に元に戻します。クラスターの状態が Git と一致するようになります。

 **プルーニング**: Git から除去されたリソースを自動的に削除します。リソースを削除できるため、使用には注意が必要です。

### アプリケーションのヘルス
<a name="_application_health"></a>

Argo CD は、アプリケーションのヘルスを継続的にモニタリングします。
+  **正常**: すべてのリソースが想定どおりに動作しています。
+  **進行中**: リソースは作成中または更新中です。
+  **低下**: 一部のリソースが正常ではありません。
+  **中断**: アプリケーションが一時停止しています。
+  **欠落**: クラスターにリソースがありません。

### 同期期間
<a name="_sync_windows"></a>

同期期間を設定して、どのような場合にアプリケーションを同期できるかを制御します。
+ メンテナンス期間中にのみ同期を許可します。
+ 営業時間中の同期をブロックします。
+ 特定の時間に自動同期をスケジュールします。
+ 変更を行い、同期を停止する必要がある状況で同期ウィンドウを使用する (ブレークグラスシナリオ)

## ウェブフックを設定して同期を高速化する
<a name="_webhook_configuration_for_faster_sync"></a>

デフォルトでは、Argo CD は 6 分ごとに Git リポジトリをポーリングして変更がないか検出します。デプロイの応答性を高めるには、変更がプッシュされたらすぐに同期をトリガーするように Git ウェブフックを設定します。

ウェブフックには、次のような利点があります。
+ コードがプッシュされたらすぐに同期応答が返されます (秒か分かの違い)
+ ポーリングのオーバーヘッドが軽減され、システムのパフォーマンスが向上します。
+ API レートリミットをより効率的に使用できます。
+ フィードバックがすぐに返されるので、ユーザーエクスペリエンスが向上します。

### ウェブフックエンドポイント
<a name="_webhook_endpoint"></a>

ウェブフック URL はパターン `${serverUrl}/api/webhook` に従います。ここでは、Argo CD サーバー URL は `serverUrl` です。

例えば、Argo CD サーバー URL が `https://abc123.eks-capabilities.us-west-2.amazonaws.com` の場合、ウェブフック URL は次のようになります。

```
https://abc123.eks-capabilities.us-west-2.amazonaws.com/api/webhook
```

### Git プロバイダーでウェブフックを設定する
<a name="_configure_webhooks_by_git_provider"></a>

 **GitHub**: リポジトリ設定に、Argo CD ウェブフック URL と共にウェブフックを追加します。コンテンツタイプを `application/json` に設定し、「Just the push event」を選択します。

 **GitLab**: Project 設定に、Argo CD ウェブフック URL と共にウェブフックを追加します。「Push events」とオプションで「Tag push events」を有効にします。

 **Bitbucket**: リポジトリ設定に、Argo CD ウェブフック URL と共にウェブフックを追加します。トリガーとして「Repository push」を選択します。

 **CodeCommit**: Amazon EventBridge に、CodeCommit リポジトリの状態が変化したらトリガーして、Argo CD ウェブフックエンドポイントに通知を送信するというルールを作成します。

ウェブフック設定の詳細な手順については、「[Argo CD ウェブフック設定](https://argo-cd.readthedocs.io/en/stable/operator-manual/webhook/)」を参照してください。

**注記**  
ウェブフックは、ポーリングを補完するものであり、ポーリングに置き換わるものではありません。Argo CD は、ウェブフック通知が見逃された場合に備えて、フォールバックメカニズムとしてリポジトリを継続的にポーリングします。

## 次のステップ
<a name="_next_steps"></a>
+  [Argo CD の使用](working-with-argocd.md) - Argo CD Application を作成および管理する方法を学ぶ
+  [Argo CD 機能に関する問題をトラブルシューティングする](argocd-troubleshooting.md) - Argo CD の問題をトラブルシューティングする
+  [機能リソースの使用](working-with-capabilities.md) - Argo CD 機能リソースを管理する

# Argo CD 機能に関する問題をトラブルシューティングする
<a name="argocd-troubleshooting"></a>

このトピックでは、機能のヘルスチェック、アプリケーション同期の問題、リポジトリ認証、マルチクラスターデプロイなど、EKS Capability for Argo CD をトラブルシューティングする際のガイダンスを示します。

**注記**  
EKS の機能は完全に管理され、クラスターの外部で実行されます。Argo CD サーバーログや `argocd` 名前空間にアクセスすることはできません。トラブルシューティングでは、機能のヘルス、アプリケーションのステータス、および設定に焦点を当てています。

## 機能はアクティブなのにアプリケーションが同期しない
<a name="_capability_is_active_but_applications_arent_syncing"></a>

Argo CD 機能のステータスが `ACTIVE` であるのにアプリケーションが同期しない場合は、機能のヘルスとアプリケーションのステータスを確認してください。

 **機能のヘルスを確認する**:

機能のヘルスとステータスの問題は、EKS コンソールまたは AWS CLI を使用して表示できます。

 **コンソール:**

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択します。

1. **[オブザーバビリティ]** タブを選択します。

1. **[クラスターを監視する]** を選択します。

1. **[機能]** タブを選択すると、すべての機能のヘルスとステータスが表示されます。

 **AWS CLI**:

```
# View capability status and health
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-argocd

# Look for issues in the health section
```

 **一般的な原因:**
+  **リポジトリが設定されていない**: Git リポジトリが Argo CD に追加されていません。
+  **認証に失敗した**: SSH キー、トークン、または CodeCommit 認証情報が無効です。
+  **Application が作成されていない**: クラスターに Application リソースが存在しません。
+  **同期ポリシー**: 手動同期が必要です (自動同期は有効になっていません)。
+  **IAM アクセス許可**: CodeCommit または Secrets Manager に対するアクセス許可がありません。

 **アプリケーションのステータスを確認する**:

```
# List applications
kubectl get application -n argocd

# View sync status
kubectl get application my-app -n argocd -o jsonpath='{.status.sync.status}'

# View application health
kubectl get application my-app -n argocd -o jsonpath='{.status.health}'
```

 **アプリケーションの条件を確認する**:

```
# Describe application to see detailed status
kubectl describe application my-app -n argocd

# View application health
kubectl get application my-app -n argocd -o jsonpath='{.status.health}'
```

## アプリケーションが「進行中」のまま変化しない
<a name="_applications_stuck_in_progressing_state"></a>

アプリケーションが `Progressing` であるのに `Healthy` に達しない場合は、アプリケーションのリソースステータスとイベントを確認してください。

 **リソースのヘルスを確認する**:

```
# View application resources
kubectl get application my-app -n argocd -o jsonpath='{.status.resources}'

# Check for unhealthy resources
kubectl describe application my-app -n argocd | grep -A 10 "Health Status"
```

 **一般的な原因:**
+  **デプロイの準備が完了していない**: ポッドの起動に失敗したか、準備状況プローブが失敗しています。
+  **リソースの依存関係**: リソースが他のリソースの準備を待っています。
+  **イメージプルエラー**: コンテナイメージにアクセスできません。
+  **リソースが不十分**: クラスターでポッドの CPU やメモリが不足しています。

 **ターゲットクラスターの設定を検証する** (マルチクラスター設定の場合):

```
# List registered clusters
kubectl get secret -n argocd -l argocd.argoproj.io/secret-type=cluster

# View cluster secret details
kubectl get secret cluster-secret-name -n argocd -o yaml
```

## リポジトリの認証に失敗する
<a name="_repository_authentication_failures"></a>

Argo CD が Git リポジトリにアクセスできない場合は、認証設定を確認してください。

 **CodeCommit リポジトリの場合**:

IAM 機能ロールに CodeCommit へのアクセス許可があることを確認します。

```
# View IAM policies
aws iam list-attached-role-policies --role-name my-argocd-capability-role
aws iam list-role-policies --role-name my-argocd-capability-role

# Get specific policy details
aws iam get-role-policy --role-name my-argocd-capability-role --policy-name policy-name
```

ロールにはリポジトリに対する `codecommit:GitPull` アクセス許可が必要です。

 **プライベート Git リポジトリの場合**:

リポジトリの認証情報が正しく設定されていることを確認します。

```
# Check repository secret exists
kubectl get secret -n argocd repo-secret-name -o yaml
```

シークレットに適切な認証情報 (SSH キー、トークン、またはユーザー名/パスワード) が含まれていることを確認します。

 **Secrets Manager を使用するリポジトリの場合**:

```
# Verify IAM Capability Role has Secrets Manager permissions
aws iam list-attached-role-policies --role-name my-argocd-capability-role

# Test secret retrieval
aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:region-code:111122223333:secret:my-secret
```

## マルチクラスターデプロイに関する問題
<a name="_multi_cluster_deployment_issues"></a>

アプリケーションがリモートクラスターにデプロイされていない場合は、クラスターの登録とアクセスの設定を確認してください。

 **クラスターの登録を確認する**:

```
# List registered clusters
kubectl get secret -n argocd -l argocd.argoproj.io/secret-type=cluster

# Verify cluster secret format
kubectl get secret CLUSTER_SECRET_NAME -n argocd -o yaml
```

`server` フィールドに、Kubernetes API URL ではなく EKS クラスター ARN が含まれていることを確認します。

 **ターゲットクラスターのアクセスエントリを確認する**:

ターゲットクラスターで、Argo CD 機能ロールにアクセスエントリがあることを確認します。

```
# List access entries (run on target cluster or use AWS CLI)
aws eks list-access-entries --cluster-name target-cluster

# Describe specific access entry
aws eks describe-access-entry \
  --cluster-name target-cluster \
  --principal-arn arn:aws:iam::[.replaceable]111122223333:role/my-argocd-capability-role
```

 **クロスアカウントの IAM アクセス許可を確認する**:

クロスアカウントデプロイの場合、ターゲットクラスターで Argo CD 機能ロールにアクセスエントリがあることを確認します。マネージド機能は、IAM ロールの引き受けではなく、クロスアカウントアクセスの EKS アクセスエントリを使用します。

マルチクラスター設定の詳細については、「[ターゲットクラスターを登録する](argocd-register-clusters.md)」を参照してください。

## 次のステップ
<a name="_next_steps"></a>
+  [Argo CD に関する考慮事項](argocd-considerations.md) - Argo CD の考慮事項とベストプラクティス
+  [Argo CD の使用](working-with-argocd.md) - Argo CD Application を作成して管理する
+  [ターゲットクラスターを登録する](argocd-register-clusters.md) - マルチクラスターデプロイを設定する
+  [EKS 機能をトラブルシューティングする](capabilities-troubleshooting.md) - 一般的な機能をトラブルシューティングする際のガイダンス

# EKS Capability for Argo CD とセルフマネージド Argo CD を比較する
<a name="argocd-comparison"></a>

EKS Capability for Argo CD により、完全マネージド型の Argo CD を EKS で動作させることができます。EKS 機能とセルフマネージドソリューションの全般的な比較については、「[EKS 機能と考慮事項](capabilities-considerations.md)」を参照してください。このトピックでは、認証、マルチクラスター管理、アップストリーム機能のサポートなど、Argo CD 固有の違いに焦点を当てます。

## アップストリーム Argo CD との違い
<a name="_differences_from_upstream_argo_cd"></a>

EKS Capability for Argo CD は、アップストリームの Argo CD に基づいていますが、アクセス方法、設定方法、AWS サービスとの統合方法が異なります。

 **RBAC と認証**: 機能が備える RBAC ロールには管理者、編集者、ビューワーの 3 つがあり、Argo CD に組み込みの認証ではなく AWS アイデンティティセンターを使用して認証を行います。Argo CD の `argocd-rbac-cm` ConfigMap ではなく、機能の `rbacRoleMapping` パラメータを使用して、アイデンティティセンターのグループを Argo CD ロールにマッピングするように、ロールマッピングを設定します。Argo CD UI は独自のダイレクト URL (クラスターの [機能] タブの EKS コンソールで確認) でホストされ、API アクセスは IAM を介した AWS 認証と認可を使用します。

 **クラスター設定**: ローカルクラスターやハブアンドスポークトポロジは自動的には設定されません。自分でデプロイターゲットクラスターと EKS アクセスエントリを設定します。Amazon EKS クラスターがデプロイターゲットとしてサポートされるのは、Kubernetes API サーバー URL ではなく EKS クラスター ARN を使用している場合のみです。ローカルクラスター (`kubernetes.default.svc`) がデプロイターゲットとして自動的に追加されることはありません。機能の作成先と同じクラスターにデプロイするには、ARN を使用してそのクラスターを明示的に登録します。

 **シンプルなリモートクラスターアクセス**: EKS アクセスエントリを使用して Argo CD にリモートクラスターへのアクセスを許可することで、マルチクラスターのデプロイをシンプルにします。そのため、サービスアカウントの IAM ロール (IRSA) を設定したり、クロスアカウント IAM ロールの前提条件をセットアップしたりする必要がありません。また、VPC ピアリングや特殊なネットワーク設定を施すことなく、完全にプライベートな EKS クラスターに透過的にアクセスできます。AWS が Argo CD 機能とプライベートリモートクラスターとの接続を自動的に管理します。

 **AWS サービスの直接統合**: 機能ロールの IAM アクセス許可により、AWS サービスを直接統合します。リポジトリ設定を作成しなくても、CodeCommit リポジトリ、ECR Helm チャート、および CodeConnections を Application リソースで直接参照できます。これにより、認証がシンプルになり、AWS サービスごとに認証情報を管理する必要がありません。詳細については、「[リポジトリアクセスを設定する](argocd-configure-repositories.md)」を参照してください。

 **名前空間のサポート**: この機能では、Argo CD Application、ApplicationSet、および AppProject カスタムリソースを作成する必要がある単一の名前空間を指定する必要があります。

**注記**  
この名前空間の制限は、Argo CD 独自のカスタムリソース (Application、ApplicationSet、AppProject) にのみ適用されます。アプリケーションワークロードは、任意のターゲットクラスター内の任意の名前空間にデプロイできます。例えば、名前空間 `argocd` でこの機能を作成する場合、すべての Application CR を `argocd` 名前空間に作成する必要がありますが、それらの Application はワークロードを `default`、`production`、`staging`、またはその他の名前空間にデプロイできます。

**注記**  
マネージド機能には、CLI の使用と AppProject 設定に関する特定の要件があります。  
Argo CD CLI を使用する場合は、名前空間プレフィックス `argocd app sync namespace/appname` を使用してアプリケーションを指定します。
AppProject リソースは `.spec.sourceNamespaces` を指定して、プロジェクトが Application を監視できる名前空間を定義する必要があります (通常は、機能の作成時に指定した名前空間を設定します)。
リソース追跡注釈は形式 `namespace_appname:group/kind:namespace/name` を使用します。

 **サポートされていない機能**: 次の機能は、マネージド機能では使用できません。
+ Config Management Plugin (CMP) によるカスタムマニフェストの生成
+ カスタム Lua スクリプトによるリソースヘルスの評価 (標準リソースに対する組み込みのヘルスチェックはサポートされています)
+ Notifications コントローラー
+ カスタム SSO プロバイダー (AWS アイデンティティセンターを利用したサードパーティーのフェデレーション ID を含め、AWS アイデンティティセンターのみがサポートされています)
+ UI の拡張機能とカスタムのバナー
+ `argocd-cm` や `argocd-params` などの設定 ConfigMaps への直接アクセス
+ 同期タイムアウトの変更 (120 秒に固定)

 **互換性**: Application と ApplicationSet は、アップストリーム Argo CD と同じように動作し、マニフェストの変更は不要です。この機能は同じ Kubernetes API と CRD を使用するため、`kubectl` のようなツールは同じように機能します。完全にサポートされるのは、Application と ApplicationSet、自動同期を備えた GitOps ワークフロー、マルチクラスターデプロイ、同期ポリシー (自動、プルーニング、自己修復)、同期ウェーブと同期フック、標準 Kubernetes リソースのヘルス評価、ロールバック機能、Git リポジトリソース (HTTPS と SSH)、Helm、Kustomize、プレーン YAML マニフェスト、GitHub アプリ認証情報、マルチテナンシーのプロジェクト、リソースの除外と包含です。

## マネージド機能で Argo CD CLI を使用する
<a name="argocd-cli-configuration"></a>

Argo CD CLI は、ほとんどのオペレーションでアップストリーム Argo CD と同じように動作しますが、認証とクラスター登録が異なります。

### 前提条件
<a name="_prerequisites"></a>

[アップストリームインストール手順](https://argo-cd.readthedocs.io/en/stable/cli_installation/)に従って Argo CD CLI をインストールしていること。

### 設定
<a name="_configuration"></a>

環境変数を使用して CLI を設定する:

1. EKS コンソール (クラスターの **[機能]** タブの下) または AWS CLI を使用して、Argo CD サーバー URL を取得します。`https://` プレフィックスを削除する必要があります。

   ```
   export ARGOCD_SERVER=$(aws eks describe-capability \
     --cluster-name my-cluster \
     --capability-name my-argocd \
     --query 'capability.configuration.argoCd.serverUrl' \
     --output text \
     --region region-code | sed 's|^https://||')
   ```

1. Argo CD UI (**[設定]** → **[アカウント]** → **[管理者]** → **[新しいトークンを生成]**) からアカウントトークンを生成して、環境変数として設定します。

   ```
   export ARGOCD_AUTH_TOKEN="your-token-here"
   ```

**重要**  
このように生成した管理者アカウントトークンは、初期セットアップと開発ワークフローに使用します。本番稼働のユースケースでは、プロジェクト範囲のロールとトークンを使用して、最小特権の原則に従います。Project のロールと RBAC の詳細については、「[Argo CD アクセス許可を設定する](argocd-permissions.md)」を参照してください。

1. 必要な gRPC オプションを設定します。

   ```
   export ARGOCD_OPTS="--grpc-web"
   ```

これらの環境変数を設定すると、`argocd login` コマンドを実行しなくても Argo CD CLI を使用できます。

### 主な違い
<a name="_key_differences"></a>

マネージド機能では、CLI に次の制限があります。
+  `argocd admin` コマンドはサポートされていません (直接ポッドアクセスが必要です)。
+  `argocd login` はサポートされていません (代わりにアカウントトークンまたはプロジェクトトークンを使用します)。
+  `argocd cluster add` には、EKS クラスター ARN を指定した `--aws-cluster-name` フラグが必要です。

### 例: クラスターを登録する
<a name="_example_register_a_cluster"></a>

アプリケーションをデプロイするための EKS クラスターを登録します。

```
# Get the cluster ARN
CLUSTER_ARN=$(aws eks describe-cluster \
  --name my-cluster \
  --query 'cluster.arn' \
  --output text)

# Register the cluster
argocd cluster add $CLUSTER_ARN \
  --aws-cluster-name $CLUSTER_ARN \
  --name in-cluster \
  --project default
```

Argo CD CLI の詳細なドキュメントについては、「[Argo CD CLI リファレンス](https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd/)」を参照してください。

## 移行パス
<a name="_migration_path"></a>

セルフマネージド Argo CD からマネージド機能に移行できます。

1. サポートされていない機能 (Notifications コントローラー、CMP、カスタムヘルスチェック、UI 拡張機能) の現在の Argo CD 設定を確認します。

1. セルフマネージド Argo CD コントローラーをゼロレプリカにスケールして、競合を防ぐ

1. クラスターに Argo CD 機能リソースを作成します。

1. 既存の Application、ApplicationSet、AppProject をエクスポートします。

1. リポジトリ認証情報、クラスターシークレット、リポジトリ認証情報テンプレート (repocreds) を移行します。

1. GPG キー、TLS 証明書、または SSH 既知のホストを使用する場合は、こうした設定も移行します。

1. クラスター名または EKS クラスター ARN を使用するように `destination.server` フィールドを更新します。

1. それらをマネージド Argo CD インスタンスに適用します。

1. アプリケーションが正しく同期されていることを確認します。

1. セルフマネージド Argo CD インストールを廃止します。

マネージド機能は同じ Argo CD API とリソース定義を使用するため、既存のマニフェストは最小限の変更を加えるだけで動作します。

## 次のステップ
<a name="_next_steps"></a>
+  [Argo CD 機能を作成する](create-argocd-capability.md) - Argo CD 機能を作成する
+  [Argo CD の使用](working-with-argocd.md) - 最初のアプリケーションをデプロイする
+  [Argo CD に関する考慮事項](argocd-considerations.md) - AWS アイデンティティセンターの統合を設定する

# kro (Kube Resource Orchestrator) を使用したリソース構成
<a name="kro"></a>

 **kro (Kube Resource Orchestrator)** はオープンソースの Kubernetes ネイティブプロジェクトで、シンプルで簡単な設定を使用してカスタム Kubernetes API を定義できます。kro を使用すると、Kubernetes オブジェクトのグループとその間の論理オペレーションを作成する新しいカスタム API を簡単に設定できます。

AWS では EKS の機能を使用して kro を完全に管理できるため、クラスターに kro コントローラーを導入して保守およびスケールする必要がありません。

## kro の仕組み
<a name="_how_kro_works"></a>

kro では、カスタム Kubernetes API を簡潔かつ効率的に作成できる `ResourceGraphDefinition` (RGD) というカスタムリソース定義 (CRD) が導入されています。`ResourceGraphDefinition` を作成すると、kro はネイティブの Kubernetes 拡張機能を使用して、クラスターに新しい API を作成および管理します。この単一のリソース仕様から、kro は仕様に基づいて新しい CRD を作成して登録し、新しく定義されたカスタムリソースを管理するように適応します。

RGD には複数のリソースを含めることができ、kro が相互依存関係とリソースの順序を決定するため、ユーザーがそれを行う必要はありません。シンプルな構文を使用して、あるリソースから別のリソースに設定を挿入できるため、構成が大幅に簡素化され、クラスター内の「グルー」演算子が不要になります。kro を使用すると、カスタムリソースには、ネイティブの Kubernetes リソースだけでなく、クラスターにインストールされている任意のカスタムリソース定義 (CRD) も含めることができます。

kro は、1 つの主要なリソースタイプをサポートしています。
+  **ResourceGraphDefinition (RGD)**: Kubernetes カスタムリソースを定義し、1 つ以上の基盤となるネイティブまたはカスタム Kubernetes リソースをカプセル化します。

このリソースに加えて、kro は、RGD を使用して作成されたカスタムリソースと、それらを構成するすべてのリソースのライフサイクルを作成および管理します。

kro は AWS Controllers for Kubernetes (ACK) とシームレスに統合されており、ワークロードリソースと AWS リソースを組み合わせて、より高いレベルの抽象化を作成できます。これにより、独自のクラウド構成要素を作成し、リソース管理を簡素化し、組織標準に基づくデフォルトおよびイミュータブルな構成設定で再利用可能なパターンを有効にすることができます。

## kro のメリット
<a name="_benefits_of_kro"></a>

kro を使用すると、プラットフォームチームは、複数のリソースを高レベルの抽象化に構成するカスタム Kubernetes API を作成できます。これにより、開発者は、シンプルで標準化され、バージョン管理されたカスタムリソースを使用して複雑なアプリケーションをデプロイできるため、リソース管理が簡素化されます。一般的なリソースの組み合わせに再利用可能なパターンを定義することで、組織全体で一貫したリソースの作成が可能になります。

kro は、[Kubernetes の Common Expression Language (CEL)](https://kubernetes.io/docs/reference/using-api/cel/) を使用してリソース間で値を渡し、条件付きロジックを組み込むことで、リソース構成に柔軟性を提供します。Kubernetes リソースと、ACK によって管理される AWS リソースの両方を統合したカスタム API に構成できるため、アプリケーションとインフラストラクチャの完全な定義が可能になります。

kro は、Kubernetes マニフェストによる宣言型設定をサポートしており、既存の開発プロセスとシームレスに統合される GitOps ワークフローや Infrastructure as Code のプラクティスを実現します。AWS では、EKS マネージド機能の一部として、kro を完全に管理できるため、クラスターに kro コントローラーを導入して設定および保守する必要がありません。

 **例: ResourceGraphDefinition の作成** 

次の例は、デプロイとサービスを使用してウェブアプリケーションを作成するシンプルな `ResourceGraphDefinition` を示しています。

```
apiVersion: kro.run/v1alpha1
kind: ResourceGraphDefinition
metadata:
  name: web-application
spec:
  schema:
    apiVersion: v1alpha1
    kind: WebApplication
    spec:
      name: string
      replicas: integer | default=3
  resources:
    - id: deployment
      template:
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: ${schema.spec.name}
        spec:
          replicas: ${schema.spec.replicas}
    - id: service
      template:
        apiVersion: v1
        kind: Service
        metadata:
          name: ${schema.spec.name}
```

ユーザーが `WebApplication` カスタムリソースのインスタンスを作成すると、kro は対応するデプロイおよびサービスリソースを自動的に作成し、カスタムリソースと共にライフサイクルを管理します。

## 他の EKS マネージド機能との統合
<a name="_integration_with_other_eks_managed_capabilities"></a>

kro は、他の EKS マネージド機能と統合されています。
+  **Kubernetes 用 AWS コントローラー (ACK)**: kro を使用して ACK リソースを高レベルの抽象化に構成し、AWS リソース管理を簡素化します。
+  **Argo CD**: Argo CD を使用して、複数のクラスターにまたがる kro カスタムリソースのデプロイを管理し、プラットフォームの構成要素とアプリケーションスタックの GitOps ワークフローを有効にします。

## kro の開始方法
<a name="_getting_started_with_kro"></a>

EKS Capability for kro の使用を開始するには:

1.  AWS コンソール、AWS CLI、または任意の Infrastructure as Code ツールを使用して、EKS クラスターに [kro 機能リソースを作成](create-kro-capability.md)します。

1. カスタム API とリソース構成を定義する ResourceGraphDefinitions (RGDs) を作成します。

1. カスタムリソースのインスタンスを適用して、基盤となる Kubernetes リソースと AWS リソースをプロビジョニングおよび管理します。

# kro 機能の作成
<a name="create-kro-capability"></a>

このトピックでは、Amazon EKS クラスター上で kro 機能を作成する方法について説明します。

## 前提条件
<a name="_prerequisites"></a>

kro 機能を作成する前に、以下があることを確認してください。
+ サポート対象の Kubernetes バージョン (標準サポートと延長サポートのすべてのバージョンがサポート対象) を実行している Amazon EKS クラスターが存在する
+ EKS クラスターに機能リソースを作成するための十分な IAM アクセス許可がある
+ (CLI/eksctl の場合) 適切な CLI ツールがインストールおよび設定されている

**注記**  
ACK や Argo CD とは異なり、kro は信頼ポリシー以外の追加の IAM アクセス許可を必要としません。kro はクラスター内で完全に動作し、AWS API コールを行いません。ただし、IAM 機能ロールに適切な信頼ポリシーを指定する必要があります。kro の Kubernetes RBAC アクセス許可の設定については、「[kro アクセス許可の設定](kro-permissions.md)」を参照してください。

## ツールを選択する
<a name="_choose_your_tool"></a>

AWS マネジメントコンソール、AWS CLI、または eksctl を使用して、kro 機能を作成できます。
+  [コンソールを使用して kro 機能を作成する](kro-create-console.md) - 指示に従って操作する場合はコンソールを使用します。
+  [AWS CLI を使用して kro 機能を作成する](kro-create-cli.md) - スクリプトを作成して自動化を図る場合は AWS CLI を使用します。
+  [eksctl を使用して kro 機能を作成する](kro-create-eksctl.md) - Kubernetes ネイティブの操作をする場合は eksctl を使用します。

## kro 機能を作成した場合の動作
<a name="_what_happens_when_you_create_a_kro_capability"></a>

kro 機能を作成すると、次の処理が行われます。

1. EKS は kro 機能サービスを作成し、クラスター内のリソースを監視および管理するように設定する

1. カスタムリソース定義 (CRD) がクラスターにインストールされます。

1. ResourceGraphDefinitions とそのインスタンスを管理するアクセス許可を付与する `AmazonEKSKROPolicy` を使用して、IAM 機能ロールのアクセスエントリが自動的に作成されます (「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照)。

1. kro 機能が、指定した IAM 機能ロールを引き受ける (信頼関係にのみ使用される)

1. kro が `ResourceGraphDefinition` リソースとそのインスタンスの監視を開始する

1. 機能のステータスが `CREATING` から `ACTIVE` に変わります。

アクティブになったら、ResourceGraphDefinitions を作成してカスタム API を定義し、それらの API のインスタンスを作成できます。

**注記**  
自動的に作成されたアクセスエントリには、ResourceGraphDefinitions とそのインスタンスを管理するための kro アクセス許可を付与する `AmazonEKSKROPolicy` が含まれます。ResourceGraphDefinitions で定義されている基盤となる Kubernetes リソース (デプロイ、サービス、ACK リソースなど) を kro で作成するには、追加のアクセスエントリポリシーを設定する必要があります。アクセスエントリの詳細と追加のアクセス許可の設定方法については、「[kro アクセス許可の設定](kro-permissions.md)」および「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

## 次のステップ
<a name="_next_steps"></a>

kro 機能を作成した後:
+  [kro の概念](kro-concepts.md) - kro の概念とリソース構成を理解する
+  [kro の概念](kro-concepts.md) - SimpleSchema、CEL 式、リソース構成パターンについて学ぶ

# コンソールを使用して kro 機能を作成する
<a name="kro-create-console"></a>

このトピックでは、AWS マネジメントコンソール を使用して kro (Kube Resource Orchestrator) 機能を作成する方法について説明します。

## kro 機能を作成する
<a name="_create_the_kro_capability"></a>

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択して、クラスターの詳細ページを開きます。

1. **[機能]** タブを選択します。

1. 左側のナビゲーションで、**[kro (Kube Resource Orchestrator)]** を選択します。

1. **[kro 機能の作成]** を選択します。

1. **IAM 機能ロール**に対して以下の操作を行います。
   + IAM 機能ロールが既に存在する場合は、ドロップダウンから選択します。
   + 新しいロールを作成する必要がある場合は、**[kro ロールを作成]** を選択します。

     これにより、信頼ポリシーが事前に入力された新しいタブで IAM コンソールが開きます。kro はクラスター内で完全に動作するため、このロールには追加の IAM アクセス許可は必要ありません。

     ロールを作成して EKS コンソールに戻ると、そのロールが自動的に選択されます。
**注記**  
ACK や Argo CD とは異なり、kro は信頼ポリシー以外の追加の IAM アクセス許可を必要としません。kro はクラスター内で完全に動作し、AWS API コールを行いません。

1. **[作成]** を選択します。

機能作成プロセスが始まります。

## 機能がアクティブであることを確認する
<a name="_verify_the_capability_is_active"></a>

1. **[機能]** タブで、kro 機能のステータスを表示します。

1. ステータスが `CREATING` から `ACTIVE` に変わるまで待ちます。

1. アクティブになったら、この機能を使用する準備は完了です。

機能のステータスとトラブルシューティングの詳細については、「[機能リソースの使用](working-with-capabilities.md)」を参照してください。

## Kubernetes リソースを管理するためのアクセス許可を付与する
<a name="_grant_permissions_to_manage_kubernetes_resources"></a>

kro 機能を作成すると、`AmazonEKSKROPolicy` を使用して EKS アクセスエントリが自動的に作成されます。これにより、kro で ResourceGraphDefinitions とそのインスタンスを管理できます。ただし、ResourceGraphDefinitions で定義されている基盤となる Kubernetes リソース (デプロイ、サービス、ConfigMaps など) を作成するアクセス許可はデフォルトでは付与されません。

この設計は、最小特権の原則に従った意図的なものです。異なる ResourceGraphDefinitions にはそれぞれ異なるアクセス許可が必要となります。それぞれの ResourceGraphDefinitions が管理するリソースに基づいて、kro に必要なアクセス許可を明示的に設定する必要があります。

迅速な開始、テスト、または開発環境については、`AmazonEKSClusterAdminPolicy` を使用します。

1. EKS コンソールで、クラスターの **[アクセス]** タブに移動します。

1. **[アクセスエントリ]** で、kro 機能ロールのエントリを見つけます (以前に作成したロール ARN が表示されます)。

1. アクセスエントリを選択して詳細を開きます。

1. **[アクセスポリシー]** セクションで、**[アクセスポリシーを関連付ける]** を選択します。

1. ポリシーリストから `AmazonEKSClusterAdminPolicy` を選択します。

1. **[アクセスの範囲]** で、**[クラスター]** を選択します。

1. **関連付ける** を選択してください。

**重要**  
`AmazonEKSClusterAdminPolicy` は、すべての名前空間について任意のリソースタイプを作成する機能など、すべての Kubernetes リソースを作成および管理するための広範なアクセス許可を付与します。これは開発や POC には便利ですが、本番環境では使用しないでください。本番環境では、それぞれの ResourceGraphDefinitions が管理する特定のリソースに必要なアクセス許可のみを付与する、カスタム RBAC ポリシーを作成してください。最小特権のアクセス許可の設定に関するガイダンスについては、「[kro アクセス許可の設定](kro-permissions.md)」および「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

## カスタムリソースが使用可能であることを確認する
<a name="_verify_custom_resources_are_available"></a>

機能がアクティブになったら、kro カスタムリソースがクラスターで使用可能になっていることを確認します。

 **コンソールの使用** 

1. Amazon EKS コントロールでクラスターに移動します。

1. **[リソース]** タブを選択します。

1. **[拡張機能]** を選択します。

1. **[CustomResourceDefinitions]** を選択します。

`ResourceGraphDefinition` リソースタイプがリストされます。

 **kubectl を使用する** 

```
kubectl api-resources | grep kro.run
```

`ResourceGraphDefinition` リソースタイプがリストされます。

## 次のステップ
<a name="_next_steps"></a>
+  [kro の概念](kro-concepts.md) - kro の概念とリソース構成を理解する
+  [kro の概念](kro-concepts.md) - SimpleSchema、CEL 式、構成パターンについて学ぶ
+  [機能リソースの使用](working-with-capabilities.md) - kro 機能リソースを管理する

# AWS CLI を使用して kro 機能を作成する
<a name="kro-create-cli"></a>

このトピックでは、AWS CLI を使用して kro (Kube Resource Orchestrator) 機能を作成する方法について説明します。

## 前提条件
<a name="_prerequisites"></a>
+  **AWS CLI** バージョン `2.12.3` 以降。バージョンを確認するには、`aws --version` を実行します。詳細についてはAWS コマンドラインインターフェイスユーザーガイドの「[インストール](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)」を参照してください。
+  **`kubectl`** - Kubernetes クラスターを操作するためのコマンドラインツール。詳細については、「[`kubectl` および `eksctl` のセットアップ](install-kubectl.md)」を参照してください。

## ステップ 1: IAM 機能ロールを作成する
<a name="_step_1_create_an_iam_capability_role"></a>

信頼ポリシーファイルを作成します。

```
cat > kro-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

IAM ロールを作成します。

```
aws iam create-role \
  --role-name KROCapabilityRole \
  --assume-role-policy-document file://kro-trust-policy.json
```

**注記**  
ACK や Argo CD とは異なり、kro には追加の IAM アクセス許可は必要ありません。kro はクラスター内で完全に動作し、AWS API コールを行いません。このロールは、EKS 機能サービスとの信頼関係を確立するためにのみ必要です。

## ステップ 2: kro 機能を作成する
<a name="_step_2_create_the_kro_capability"></a>

クラスターに kro 機能リソースを作成します。*region-code* をクラスターが配置されている AWS リージョン (`us-west-2` など) に、*my-cluster* をクラスター名に置き換えます。

```
aws eks create-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-kro \
  --type KRO \
  --role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/KROCapabilityRole \
  --delete-propagation-policy RETAIN
```

このコマンドはすぐに戻りますが、EKS が必要な機能インフラストラクチャとコンポーネントを作成するため、機能がアクティブになるまでにはしばらく時間がかかります。EKS は、この機能に関連する Kubernetes カスタムリソース定義をその作成時にクラスターにインストールします。

**注記**  
クラスターが存在しないというエラーやアクセス許可がないというエラーが表示された場合は、以下の点を確認します。  
クラスター名が正しいこと
AWS CLI が正しいリージョンに設定されていること
必要な IAM アクセス許可を追加したこと

## ステップ 3: 機能がアクティブであることを確認する
<a name="_step_3_verify_the_capability_is_active"></a>

機能がアクティブになるまで待機します。*region-code* はクラスターがある AWS リージョンに、*my-cluster* はクラスターの名前に置き換えます。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-kro \
  --query 'capability.status' \
  --output text
```

ステータスが `ACTIVE` と表示されたら、機能の準備は完了です。

機能の詳細全体を表示することもできます。

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-kro
```

## ステップ 4: Kubernetes リソースを管理するためのアクセス許可を付与する
<a name="_step_4_grant_permissions_to_manage_kubernetes_resources"></a>

kro 機能を作成すると、`AmazonEKSKROPolicy` を使用して EKS アクセスエントリが自動的に作成されます。これにより、kro で ResourceGraphDefinitions とそのインスタンスを管理できます。ただし、ResourceGraphDefinitions で定義されている基盤となる Kubernetes リソース (デプロイ、サービス、ConfigMaps など) を作成するアクセス許可はデフォルトでは付与されません。

この設計は、最小特権の原則に従った意図的なものです。異なる ResourceGraphDefinitions にはそれぞれ異なるアクセス許可が必要となります。例: \$1ConfigMaps と Secrets のみを作成する ResourceGraphDefinition には、デプロイとサービスを作成する ResourceGraphDefinition とは異なるアクセス許可が必要です。\$1ACK リソースを作成する ResourceGraphDefinition には、それらの特定のカスタムリソースに対するアクセス許可が必要です。\$1一部の ResourceGraphDefinitions は、新しいリソースを作成せずに既存のリソースのみを読み取る場合があります。

それぞれの ResourceGraphDefinitions が管理するリソースに基づいて、kro に必要なアクセス許可を明示的に設定する必要があります。

### Quick Setup
<a name="_quick_setup"></a>

迅速な開始、テスト、または開発環境については、`AmazonEKSClusterAdminPolicy` を使用します。

機能ロール ARN を取得します。

```
CAPABILITY_ROLE_ARN=$(aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-kro \
  --query 'capability.roleArn' \
  --output text)
```

クラスター管理ポリシーを関連付けます。

```
aws eks associate-access-policy \
  --region region-code \
  --cluster-name my-cluster \
  --principal-arn $CAPABILITY_ROLE_ARN \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
  --access-scope type=cluster
```

**重要**  
`AmazonEKSClusterAdminPolicy` は、すべての名前空間について任意のリソースタイプを作成する機能など、すべての Kubernetes リソースを作成および管理するための広範なアクセス許可を付与します。これは開発や POC には便利ですが、本番環境では使用しないでください。本番環境では、それぞれの ResourceGraphDefinitions が管理する特定のリソースに必要なアクセス許可のみを付与する、カスタム RBAC ポリシーを作成してください。最小特権のアクセス許可の設定に関するガイダンスについては、「[kro アクセス許可の設定](kro-permissions.md)」および「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

## ステップ 5: カスタムリソースが使用可能であることを確認する
<a name="_step_5_verify_custom_resources_are_available"></a>

機能がアクティブになったら、kro カスタムリソースがクラスターで使用可能になっていることを確認します。

```
kubectl api-resources | grep kro.run
```

`ResourceGraphDefinition` リソースタイプがリストされます。

## 次のステップ
<a name="_next_steps"></a>
+  [kro の概念](kro-concepts.md) - kro の概念とリソース構成を理解する
+  [kro の概念](kro-concepts.md) - SimpleSchema、CEL 式、構成パターンについて学ぶ
+  [機能リソースの使用](working-with-capabilities.md) - kro 機能リソースを管理する

# eksctl を使用して kro 機能を作成する
<a name="kro-create-eksctl"></a>

このトピックでは、eksctl を使用して kro (Kube Resource Orchestrator) 機能を作成する方法について説明します。

**注記**  
以下のステップを実行するには、eksctl バージョン `0.220.0` 以降が必要です。バージョンを確認するには、`eksctl version` を実行します。

## ステップ 1: IAM 機能ロールを作成する
<a name="_step_1_create_an_iam_capability_role"></a>

信頼ポリシーファイルを作成します。

```
cat > kro-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
EOF
```

IAM ロールを作成します。

```
aws iam create-role \
  --role-name KROCapabilityRole \
  --assume-role-policy-document file://kro-trust-policy.json
```

**注記**  
ACK や Argo CD とは異なり、kro は信頼ポリシー以外の追加の IAM アクセス許可を必要としません。kro はクラスター内で完全に動作し、AWS API コールを行いません。

## ステップ 2: kro 機能を作成する
<a name="_step_2_create_the_kro_capability"></a>

eksctl を使用して kro 機能を作成します。*region-code* はクラスターがある AWS リージョンに、*my-cluster* はクラスターの名前に置き換えます。

```
eksctl create capability \
  --region region-code \
  --cluster my-cluster \
  --name my-kro \
  --type KRO \
  --role-arn arn:aws:iam::[.replaceable]111122223333:role/KROCapabilityRole
```

このコマンドはすぐに戻りますが、機能がアクティブになるまでにはしばらく時間がかかります。

## ステップ 3: 機能がアクティブであることを確認する
<a name="_step_3_verify_the_capability_is_active"></a>

機能のステータスを確認します。*region-code* はクラスターがある AWS リージョンに、*my-cluster* はクラスターの名前に置き換えます。

```
eksctl get capability \
  --region region-code \
  --cluster my-cluster \
  --name my-kro
```

ステータスが `ACTIVE` と表示されたら、機能の準備は完了です。

## ステップ 4: Kubernetes リソースを管理するためのアクセス許可を付与する
<a name="_step_4_grant_permissions_to_manage_kubernetes_resources"></a>

デフォルトでは、kro は ResourceGraphDefinitions とそのインスタンスのみを作成および管理できます。kro が ResourceGraphDefinitions で定義されている基盤となる Kubernetes リソースを作成および管理できるようにするには、`AmazonEKSClusterAdminPolicy` アクセスポリシーを機能のアクセスエントリに関連付けます。

機能ロール ARN を取得します。

```
CAPABILITY_ROLE_ARN=$(aws eks describe-capability \
  --region region-code \
  --cluster my-cluster \
  --name my-kro \
  --query 'capability.roleArn' \
  --output text)
```

クラスター管理ポリシーを関連付けます。

```
aws eks associate-access-policy \
  --region region-code \
  --cluster my-cluster \
  --principal-arn $CAPABILITY_ROLE_ARN \
  --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \
  --access-scope type=cluster
```

**重要**  
`AmazonEKSClusterAdminPolicy` は、すべての Kubernetes リソースを作成および管理するための広範なアクセス許可を付与し、使用開始を効率化することを目的としています。本番稼働用には、ResourceGraphDefinitions が管理する特定のリソースに必要なアクセス許可のみを付与する、より制限の厳しい RBAC ポリシーを作成します。最小特権のアクセス許可の設定に関するガイダンスについては、「[kro アクセス許可の設定](kro-permissions.md)」および「[EKS 機能のセキュリティに関する考慮事項](capabilities-security.md)」を参照してください。

## ステップ 5: カスタムリソースが使用可能であることを確認する
<a name="_step_5_verify_custom_resources_are_available"></a>

機能がアクティブになったら、kro カスタムリソースがクラスターで使用可能になっていることを確認します。

```
kubectl api-resources | grep kro.run
```

`ResourceGraphDefinition` リソースタイプがリストされます。

## 次のステップ
<a name="_next_steps"></a>
+  [kro の概念](kro-concepts.md) - kro の概念とリソース構成を理解する
+  [kro の概念](kro-concepts.md) - SimpleSchema、CEL 式、構成パターンについて学ぶ
+  [機能リソースの使用](working-with-capabilities.md) - kro 機能リソースを管理する

# kro の概念
<a name="kro-concepts"></a>

kro を使用すると、プラットフォームチームは、複数のリソースを高レベルの抽象化に構成するカスタム Kubernetes API を作成できます。このトピックでは、実用的な例を取り上げ、EKS Capability for kro を使用する際に理解しておく必要がある重要な概念について説明します。

## kro の開始方法
<a name="_getting_started_with_kro"></a>

kro 機能を作成した後 (「[kro 機能の作成](create-kro-capability.md)」を参照)、クラスターで ResourceGraphDefinitions を使用して、カスタム API の作成を開始できます。

シンプルなウェブアプリケーションの抽象化を作成する完全な例を次に示します。

```
apiVersion: kro.run/v1alpha1
kind: ResourceGraphDefinition
metadata:
  name: webapplication
spec:
  schema:
    apiVersion: v1alpha1
    kind: WebApplication
    group: kro.run
    spec:
      name: string | required=true
      image: string | default="nginx:latest"
      replicas: integer | default=3
  resources:
  - id: deployment
    template:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: ${schema.spec.name}
      spec:
        replicas: ${schema.spec.replicas}
        selector:
          matchLabels:
            app: ${schema.spec.name}
        template:
          metadata:
            labels:
              app: ${schema.spec.name}
          spec:
            containers:
            - name: app
              image: ${schema.spec.image}
              ports:
              - containerPort: 80
  - id: service
    template:
      apiVersion: v1
      kind: Service
      metadata:
        name: ${schema.spec.name}
      spec:
        selector:
          app: ${schema.spec.name}
        ports:
        - protocol: TCP
          port: 80
          targetPort: 80
```

この ResourceGraphDefinition を適用すると、アプリケーションチームは、簡素化された API を使用してウェブアプリケーションを作成できます。

```
apiVersion: kro.run/v1alpha1
kind: WebApplication
metadata:
  name: my-app
spec:
  name: my-app
  replicas: 5
```

kro は、適切な設定でデプロイとサービスを自動的に作成します。`image` が指定されていないため、スキーマのデフォルト値である `nginx:latest` が使用されます。

## 重要な概念
<a name="_core_concepts"></a>

**重要**  
kro は、ランタイムではなく作成時に ResourceGraphDefinitions を検証します。RGD を作成すると、kro は CEL 構文を検証し、式を実際の Kubernetes スキーマと照合して型チェックし、フィールドの存在を検証し、循環依存関係を検出します。つまり、RGD を作成すると、インスタンスがデプロイされる前にエラーがすぐに検出されます。

### ResourceGraphDefinition
<a name="_resourcegraphdefinition"></a>

ResourceGraphDefinition (RGD) は、以下を指定することでカスタム Kubernetes API を定義します。
+  **スキーマ** - SimpleSchema 形式 (フィールド名、型、デフォルト、検証) を使用した API 構造
+  **リソース** - 作成する基盤となる Kubernetes または AWS リソースのテンプレート
+  **依存関係** - リソースの相互関係 (フィールド参照から自動的に検出)

RGD を適用すると、kro はクラスターに新しいカスタムリソース定義 (CRD) を登録します。その後、アプリケーションチームはカスタム API のインスタンスを作成でき、kro は基盤となるすべてのリソースの作成と管理を処理します。

詳細については、kro ドキュメントの「[ResourceGraphDefinition Overview](https://kro.run/docs/concepts/rgd/overview/)」を参照してください。

### SimpleSchema 形式
<a name="_simpleschema_format"></a>

SimpleSchema は、OpenAPI の知識を必要とせずに API スキーマを定義する簡単な方法を提供します。

```
schema:
  apiVersion: v1alpha1
  kind: Database
  spec:
    name: string | required=true description="Database name"
    size: string | default="small" enum=small,medium,large
    replicas: integer | default=1 minimum=1 maximum=5
```

SimpleSchema は、`required`、`default`、`minimum`/`maximum`、`enum`、`pattern` などの制約がある、`string`、`integer`、`boolean`、`number` 型をサポートしています。

詳細については、kro ドキュメントの「[SimpleSchema](https://kro.run/docs/concepts/rgd/schema/)」を参照してください。

### CEL 式
<a name="_cel_expressions"></a>

kro は、値を動的に参照し、条件付きロジックを追加するために、Common Expression Language (CEL) を使用します。CEL 式は `${` と `}` で囲まれ、次の 2 つの方法で使用できます。

 **スタンドアロン式** - フィールド値全体が 1 つの式です。

```
spec:
  replicas: ${schema.spec.replicaCount}  # Expression returns integer
  labels: ${schema.spec.labelMap}        # Expression returns object
```

式の結果はフィールド値全体を置き換え、フィールドで想定されている型と一致する必要があります。

 **文字列テンプレート** - 文字列に埋め込まれた 1 つ以上の式:

```
metadata:
  name: "${schema.spec.prefix}-${schema.spec.name}"  # Multiple expressions
  annotation: "Created by ${schema.spec.owner}"      # Single expression in string
```

文字列テンプレートのすべての式は文字列を返す必要があります。他の型を変換するには、`string()` を使用します (例: `"replicas-${string(schema.spec.count)}"`)。

 **フィールドリファレンス** - `schema.spec` を使用してインスタンスの仕様値にアクセスします。

```
template:
  metadata:
    name: ${schema.spec.name}-deployment
    namespace: ${schema.metadata.namespace}  # Can also reference metadata
  spec:
    replicas: ${schema.spec.replicas}
```

 **オプションのフィールドアクセス** - 存在しない可能性があるフィールドには `?` を使用します。

```
# For ConfigMaps or Secrets with unknown structure
value: ${configmap.data.?DATABASE_URL}

# For optional status fields
ready: ${deployment.status.?readyReplicas > 0}
```

フィールドが存在しない場合、式は失敗せず `null` を返します。

 **条件付きリソース** - 条件が満たされた場合にのみリソースを含めます。

```
resources:
- id: ingress
  includeWhen:
    - ${schema.spec.enableIngress == true}
  template:
    # ... ingress configuration
```

`includeWhen` フィールドは、ブール式のリストを受け入れます。リソースを作成するには、すべての条件が true である必要があります。現在、`includeWhen` は `schema.spec` フィールドのみを参照できます。

 **変換** - 三項演算子と関数を使用して値を変換します。

```
template:
  spec:
    resources:
      requests:
        memory: ${schema.spec.size == "small" ? "512Mi" : "2Gi"}

    # String concatenation
    image: ${schema.spec.registry + "/" + schema.spec.imageName}

    # Type conversion
    port: ${string(schema.spec.portNumber)}
```

 **リソース間の参照** - 他のリソースからの参照値。

```
resources:
- id: bucket
  template:
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    spec:
      name: ${schema.spec.name}-data

- id: configmap
  template:
    apiVersion: v1
    kind: ConfigMap
    data:
      BUCKET_NAME: ${bucket.spec.name}
      BUCKET_ARN: ${bucket.status.ackResourceMetadata.arn}
```

CEL 式で別のリソースを参照すると、依存関係が自動的に作成されます。kro は、参照されたリソースが先に作成されることを保証します。

詳細については、kro ドキュメントの「[CEL Expressions](https://kro.run/docs/concepts/rgd/cel-expressions/)」を参照してください。

### リソースの依存関係
<a name="_resource_dependencies"></a>

kro は CEL 式から依存関係を自動的に推論します。順序を指定するのではなく、関係を記述します。あるリソースが CEL 式を使用して別のリソースを参照すると、kro は依存関係を作成し、正しい作成順序を決定します。

```
resources:
- id: bucket
  template:
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    spec:
      name: ${schema.spec.name}-data

- id: notification
  template:
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: BucketNotification
    spec:
      bucket: ${bucket.spec.name}  # Creates dependency: notification depends on bucket
```

式 `${bucket.spec.name}` は依存関係を作成します。kro は、すべてのリソースとその依存関係から有向非巡回グラフ (DAG) を構築し、作成のためのトポロジ順を計算します。

 **作成順序**: リソースはトポロジ順 (依存関係が先) で作成されます。

 **並列作成**: 依存関係のないリソースは同時に作成されます。

 **削除順序**: リソースは逆トポロジ順 (依存が先) で削除されます。

 **循環依存関係**: 許可されていません。kro は検証時に循環依存関係を含む ResourceGraphDefinitions を拒否します。

計算された作成順序を表示できます。

```
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.topologicalOrder}'
```

詳細については、kro ドキュメントの「[Graph inference](https://kro.run/docs/concepts/rgd/dependencies-ordering/)」を参照してください。

## ACK を使用した構成
<a name="_composing_with_ack"></a>

kro は、EKS Capability for ACK とシームレスに連携し、AWS リソースを Kubernetes と組み合わせて構成します。

```
resources:
# Create {aws} S3 bucket with ACK
- id: bucket
  template:
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    spec:
      name: ${schema.spec.name}-files

# Inject bucket details into Kubernetes ConfigMap
- id: config
  template:
    apiVersion: v1
    kind: ConfigMap
    data:
      BUCKET_NAME: ${bucket.spec.name}
      BUCKET_ARN: ${bucket.status.ackResourceMetadata.arn}

# Use ConfigMap in application deployment
- id: deployment
  template:
    apiVersion: apps/v1
    kind: Deployment
    spec:
      template:
        spec:
          containers:
          - name: app
            envFrom:
            - configMapRef:
                name: ${config.metadata.name}
```

このパターンでは、AWS リソースを作成し、その詳細 (ARN、URL、エンドポイント) を抽出してアプリケーション設定に挿入できます。これらはすべて、1 つのユニットとして管理されます。

その他の構成パターンと詳細な例については、「[EKS を利用する場合の kro の考慮事項](kro-considerations.md)」を参照してください。

## 次のステップ
<a name="_next_steps"></a>
+  [EKS を利用する場合の kro の考慮事項](kro-considerations.md) - EKS 固有のパターン、RBAC、および ACK と Argo CD との統合について説明します。
+  [kro ドキュメント](https://kro.run/docs/overview) - 高度な CEL 式、検証パターン、トラブルシューティングを含む、kro の包括的なドキュメントです。

# kro アクセス許可の設定
<a name="kro-permissions"></a>

ACK や Argo CD とは異なり、kro には IAM アクセス許可は必要ありません。kro は Kubernetes クラスター内で完全に動作し、AWS API コールを行いません。標準の Kubernetes RBAC を使用して kro リソースへのアクセスを制御します。

## kro でのアクセス許可の仕組み
<a name="_how_permissions_work_with_kro"></a>

kro は、異なるスコープを持つ 2 種類の Kubernetes リソースを使用します。

 **ResourceGraphDefinitions**: カスタム API を定義するクラスタースコープのリソース。通常、組織の標準を設計および維持するプラットフォームチームによって管理されます。

 **インスタンス**: ResourceGraphDefinitions から作成された名前空間スコープのカスタムリソース。適切な RBAC アクセス許可を持つアプリケーションチームが作成できます。

デフォルトでは、kro 機能には、`AmazonEKSKROPolicy` アクセスエントリポリシーを通じて、ResourceGraphDefinitions とそのインスタンスを管理するアクセス許可があります。ただし、kro には、ResourceGraphDefinitions で定義されている基盤となる Kubernetes リソース (デプロイ、サービス、ACK リソースなど) を作成および管理するための追加のアクセス許可が必要です。これらのアクセス許可は、アクセスエントリポリシーまたは Kubernetes RBAC を通じて付与する必要があります。これらのアクセス許可の付与の詳細については、「[kro 任意のリソースアクセス許可](capabilities-security.md#kro-resource-permissions)」を参照してください。

## プラットフォームチームのアクセス許可
<a name="_platform_team_permissions"></a>

プラットフォームチームには、ResourceGraphDefinitions を作成および管理するためのアクセス許可が必要です。

 **プラットフォームチームの ClusterRole の例**:

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kro-platform-admin
rules:
- apiGroups: ["kro.run"]
  resources: ["resourcegraphdefinitions"]
  verbs: ["*"]
```

 **プラットフォームチームメンバーにバインドする**:

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: platform-team-kro-admin
subjects:
- kind: Group
  name: platform-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: kro-platform-admin
  apiGroup: rbac.authorization.k8s.io
```

## アプリケーションチームのアクセス許可
<a name="_application_team_permissions"></a>

アプリケーションチームには、名前空間にカスタムリソースのインスタンスを作成するためのアクセス許可が必要です。

 **アプリケーションチームのロールの例**:

```
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: kro-app-developer
  namespace: my-app
rules:
- apiGroups: ["kro.run"]
  resources: ["webapps", "databases"]
  verbs: ["create", "get", "list", "update", "delete", "patch"]
```

 **アプリケーションチームメンバーにバインドする**:

```
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: app-team-kro-developer
  namespace: my-app
subjects:
- kind: Group
  name: app-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: kro-app-developer
  apiGroup: rbac.authorization.k8s.io
```

**注記**  
ロールの API グループ (この例では `kro.run`) は、ResourceGraphDefinition のスキーマで定義されている `apiVersion` と一致する必要があります。

## 読み取り専用アクセス
<a name="_read_only_access"></a>

変更許可なしで ResourceGraphDefinitions とインスタンスを表示する読み取り専用アクセスを付与します。

 **読み取り専用 ClusterRole**:

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kro-viewer
rules:
- apiGroups: ["kro.run"]
  resources: ["resourcegraphdefinitions"]
  verbs: ["get", "list", "watch"]
```

 **インスタンスの読み取り専用ロール**:

```
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: kro-instance-viewer
  namespace: my-app
rules:
- apiGroups: ["kro.run"]
  resources: ["webapps", "databases"]
  verbs: ["get", "list", "watch"]
```

## マルチ名前空間アクセス
<a name="_multi_namespace_access"></a>

RoleBindings と ClusterRoles を使用して、アプリケーションチームに複数の名前空間へのアクセスを付与します。

 **マルチ名前空間アクセス用の ClusterRole**:

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kro-multi-namespace-developer
rules:
- apiGroups: ["kro.run"]
  resources: ["webapps"]
  verbs: ["create", "get", "list", "update", "delete"]
```

 **特定の名前空間にバインドする**:

```
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: app-team-dev-access
  namespace: development
subjects:
- kind: Group
  name: app-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: kro-multi-namespace-developer
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: app-team-staging-access
  namespace: staging
subjects:
- kind: Group
  name: app-team
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: kro-multi-namespace-developer
  apiGroup: rbac.authorization.k8s.io
```

## ベストプラクティス
<a name="_best_practices"></a>

 **最小特権の原則**: 各チームの責任に必要な最小限のアクセス許可のみを付与します。

 **個々のユーザーの代わりにグループを使用する**: 管理を容易にするために、ロールは個々のユーザーではなくグループにバインドします。

 **プラットフォームとアプリケーションの責務を分離する**: プラットフォームチームが ResourceGraphDefinitions を管理し、アプリケーションチームがインスタンスを管理します。

 **名前空間の分離**: 名前空間を使用してさまざまなチームや環境を分離し、RBAC が各名前空間へのアクセスを制御します。

 **監査のための読み取り専用アクセス**: 監査目的で、セキュリティおよびコンプライアンスチームに読み取り専用アクセスを提供します。

## 次のステップ
<a name="_next_steps"></a>
+  [kro の概念](kro-concepts.md) - kro の概念とリソース構成を理解する
+  [kro の概念](kro-concepts.md) - SimpleSchema、CEL 式、構成パターンを理解する
+  [EKS 機能のセキュリティに関する考慮事項](capabilities-security.md) - 機能のセキュリティのベストプラクティスを見直す

# EKS を利用する場合の kro の考慮事項
<a name="kro-considerations"></a>

このトピックでは、リソース構成、RBAC パターン、他の EKS 機能との統合を使用するタイミングなど、EKS Capability for kro を使用する際の重要な考慮事項について説明します。

## kro を使用する場合
<a name="_when_to_use_kro"></a>

kro は、複雑なリソース管理を簡素化する、再利用可能なインフラストラクチャパターンとカスタム API を作成するように設計されています。

 **次の場合に kro を使用します**。
+ アプリケーションチーム向けに、簡素化された API を備えたセルフサービスプラットフォームを作成する場合
+ チーム間でインフラストラクチャパターン (データベース \$1 バックアップ \$1 モニタリング) を標準化する場合
+ リソースの依存関係を管理し、リソース間で値を渡す場合
+ 実装の複雑さを隠すカスタム抽象化を構築する場合
+ 複数の ACK リソースを高レベルの構成要素に構成する場合
+ 複雑なインフラストラクチャスタックの GitOps ワークフローを有効にする場合

 **次の場合は kro を使用しないでください**。
+ シンプルでスタンドアロンなリソースを管理する場合 (ACK または Kubernetes リソースを直接使用します)
+ 動的なランタイムロジックが必要な場合 (kro は命令型ではなく、宣言型です)
+ リソースに依存関係や共有設定がない場合

kro は、チームが複雑なインフラストラクチャを正しくデプロイしやすくする、意見が組み込まれた再利用可能なパターン (「paved paths」) の作成に優れています。

## RBAC パターン
<a name="_rbac_patterns"></a>

kro を使用すると、ResourceGraphDefinitions を作成するプラットフォームチームと、インスタンスを作成するアプリケーションチームとの間で責務を分離できます。

### プラットフォームチームの責任
<a name="_platform_team_responsibilities"></a>

プラットフォームチームは、カスタム API を定義する ResourceGraphDefinitions (RGDs) を作成および維持します。

 **必要となる権限**:
+ ResourceGraphDefinitions の作成、更新、削除
+ 基盤となるリソースタイプ (デプロイ、サービス、ACK リソース) の管理
+ RGDs が使用されるすべての名前空間へのアクセス

 **プラットフォームチーム向け ClusterRole の例**:

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: platform-kro-admin
rules:
- apiGroups: ["kro.run"]
  resources: ["resourcegraphdefinitions"]
  verbs: ["*"]
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["get", "list", "watch"]
```

RBAC 設定の詳細については、「[kro アクセス許可の設定](kro-permissions.md)」を参照してください。

### アプリケーションチームの責任
<a name="_application_team_responsibilities"></a>

アプリケーションチームは、基盤となる複雑さを理解することなく、RGDs で定義されたカスタムリソースのインスタンスを作成します。

 **必要となる権限**:
+ カスタムリソースのインスタンスの作成、更新、削除
+ 自身の名前空間への読み取りアクセス
+ 基盤となるリソースまたは RGDs へのアクセス権は不要

 **利点**:
+ チームはシンプルで高レベルの API を使用
+ プラットフォームチームが実装の詳細を制御
+ 設定ミスのリスクを低減
+ 新しいチームメンバーのオンボーディングを高速化

## 他の EKS 機能との統合
<a name="_integration_with_other_eks_capabilities"></a>

### ACK リソースの構成
<a name="_composing_ack_resources"></a>

kro は、ACK と組み合わせることで、インフラストラクチャパターンの作成において特に高い効果を発揮します。

 **一般的なパターン**:
+  **ストレージを含むアプリケーション**: S3 バケット \$1 SQS キュー \$1 通知設定
+  **データベーススタック**: RDS インスタンス \$1 パラメータグループ \$1 セキュリティグループ \$1 Secrets Manager シークレット
+  **ネットワーク**: VPC \$1 サブネット \$1 ルートテーブル \$1 セキュリティグループ \$1 NAT ゲートウェイ
+  **ストレージを含むコンピューティング**: EC2 インスタンス \$1 EBS ボリューム \$1 IAM インスタンスプロファイル

kro は、依存関係の順序付けを処理し、リソース間で (ARN や接続文字列などの) 値を渡し、ライフサイクル全体を 1 つのユニットとして管理します。

ACK リソースを作成する例については、「[ACK の概念](ack-concepts.md)」を参照してください。

### GitOps と Argo CD
<a name="_gitops_with_argo_cd"></a>

EKS Capability for Argo CD を使用して、Git リポジトリから RGDs とインスタンスの両方をデプロイします。

 **リポジトリの整理**:
+  **プラットフォームリポジトリ**: プラットフォームチームが管理する ResourceGraphDefinitions を格納
+  **アプリケーションリポジトリ**: アプリケーションチームが管理するカスタムリソースのインスタンスを格納
+  **共有リポジトリ**: 小規模な組織向けに、RGDs とインスタンスの両方を格納

 **考慮事項**:
+ インスタンスより先に RGDs をデプロイする (Argo CD の同期ウェーブが役立つ)
+ プラットフォームチームとアプリケーションチームに別々の Argo CD プロジェクトを使用する
+ プラットフォームチームが RGD リポジトリへのアクセスを制御する
+ アプリケーションチームには RGD 定義への読み取り専用アクセスを付与する

Argo CD の詳細については、「[Argo CD の使用](working-with-argocd.md)」を参照してください。

## ResourceGraphDefinitions の整理
<a name="_organizing_resourcegraphdefinitions"></a>

目的、複雑さ、所有権別に RGDs を整理します。

 **目的別**:
+  **インフラストラクチャ**: データベーススタック、ネットワーク、ストレージ
+  **アプリケーション**: ウェブアプリケーション、API、バッチジョブ
+  **プラットフォーム**: 共有サービス、モニタリング、ログ記録

 **複雑さ別**:
+  **シンプル**: 依存関係が最小限の 2～3 個のリソース
+  **中程度**: 一部に依存関係がある 5～10 個のリソース
+  **複雑**: 複雑な依存関係を持つ 10 個以上のリソース

 **命名規則**:
+ わかりやすい名前を使用する: `webapp-with-database`、`s3-notification-queue`
+ 重大な変更には、名前にバージョンを含める: `webapp-v2` 
+ 関連する RGDs には、一貫したプレフィックスを使用する: `platform- `、`app-`

 **名前空間戦略**:
+ RGDs はクラスタースコープである (名前空間なし)
+ インスタンスは名前空間に属する
+ RGDs で名前空間セレクタを使用して、インスタンスを作成できる場所を制御する

## バージョニングと更新
<a name="_versioning_and_updates"></a>

RGD の進化とインスタンスの移行を計画します。

 **RGD の更新**:
+  **重要な変更なし**: RGD をそのまま更新する (オプションフィールドを追加、includeWhen を使用した新しいリソースを追加)
+  **重大な変更**: 異なる名前の新しい RGD を作成する (webapp-v2)
+  **非推奨化**: 古い RGDs に注釈を付け、移行タイムラインを周知する

 **インスタンスの移行**:
+ 更新された RGD を使用して新しいインスタンスを作成する
+ 新しいインスタンスが正しく動作することを検証する
+ 古いインスタンスを削除する
+ kro は、基盤となるリソースの更新を自動的に処理します

 **ベストプラクティス**:
+ 最初に本番稼働用環境以外で RGD の変更をテストする
+ 主な変更には、RGD 名にセマンティックバージョニングを使用する
+ 重大な変更と移行パスを文書化する
+ アプリケーションチームに移行例を提供する

## 検証とテスト
<a name="_validation_and_testing"></a>

本番環境にデプロイする前に RGDs を検証します。

 **検証戦略**:
+  **スキーマ検証**: kro は RGD の構造を自動的に検証する
+  **ドライランインスタンス**: 開発用名前空間でテストインスタンスを作成する
+  **統合テスト**: 構成されたリソースが正しく連携することを確認する
+  **ポリシーの適用**: アドミッションコントローラーを使用して組織標準を適用する

 **テストする一般的な問題**:
+ リソースの依存関係と順序付け
+ リソース間で渡す値 (CEL 式)
+ 条件付きリソースの包含 (includeWhen)
+ 基盤となるリソースからのステータス伝播
+ インスタンス作成の RBAC アクセス許可

## アップストリームドキュメント
<a name="_upstream_documentation"></a>

kro の使用の詳細については、以下を参照してください。
+  [kro の開始方法](https://kro.run/docs/guides/getting-started) - ResourceGraphDefinitions の作成
+  [CEL 式](https://kro.run/docs/concepts/cel) - CEL 式の記述
+  [kro ガイド](https://kro.run/docs/guides/) - 高度な構成パターン
+  [トラブルシューティング](https://kro.run/docs/troubleshooting) - トラブルシューティングとデバッグ

## 次のステップ
<a name="_next_steps"></a>
+  [kro アクセス許可の設定](kro-permissions.md) - プラットフォームチームとアプリケーションチームに RBAC を設定する
+  [kro の概念](kro-concepts.md) - kro の概念とリソースライフサイクルを理解する
+  [kro 機能に関する問題をトラブルシューティングする](kro-troubleshooting.md) - kro の問題をトラブルシューティングする
+  [ACK の概念](ack-concepts.md) - 構成に使用する ACK リソースについて説明する
+  [Argo CD の使用](working-with-argocd.md) - GitOps を使用して RGDs とインスタンスをデプロイする

# kro 機能に関する問題をトラブルシューティングする
<a name="kro-troubleshooting"></a>

このトピックでは、機能ヘルスチェック、RBAC アクセス許可、CEL 式エラー、リソース構成の問題など、EKS Capability for kro をトラブルシューティングする際のガイダンスを提供します。

**注記**  
EKS の機能は完全に管理され、クラスターの外部で実行されます。コントローラーログや `kro-system` 名前空間にアクセスすることはできません。トラブルシューティングでは、機能のヘルス、RBAC の設定、リソースのステータスに焦点を当てています。

## 機能は ACTIVE だが、ResourceGraphDefinitions が機能していない
<a name="_capability_is_active_but_resourcegraphdefinitions_arent_working"></a>

kro 機能のステータスが `ACTIVE` なのに、ResourceGraphDefinitions が基盤となるリソースを作成していない場合は、機能ヘルス、RBAC アクセス許可、リソースステータスを確認してください。

 **機能のヘルスを確認する**:

機能のヘルスとステータスの問題は、EKS コンソールまたは AWS CLI を使用して表示できます。

 **コンソール:**

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択します。

1. **[オブザーバビリティ]** タブを選択します。

1. **[クラスターを監視する]** を選択します。

1. **[機能]** タブを選択すると、すべての機能のヘルスとステータスが表示されます。

 **AWS CLI**:

```
# View capability status and health
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-kro

# Look for issues in the health section
```

 **一般的な原因:**
+  **RBAC アクセス許可がない**: kro には、基盤となる Kubernetes リソースを作成するアクセス許可がありません
+  **無効な CEL 式**: ResourceGraphDefinition に構文エラーがあります。
+  **リソースの依存関係**: 依存するリソースの準備ができていません。
+  **スキーマ検証**: インスタンスが RGD スキーマの要件と一致していません。

 **RBAC アクセス許可の確認**:

```
# Check if capability has cluster admin policy
kubectl get accessentry -A | grep kro
```

機能に必要なアクセス許可がない場合は、`AmazonEKSClusterAdminPolicy` を kro 機能のアクセスエントリに関連付けるか、本番稼働用のより制限の厳しい RBAC ポリシーを作成します。詳細については、「[kro アクセス許可の設定](kro-permissions.md)」を参照してください。

 **ResourceGraphDefinition のステータスの確認**:

```
# List all RGDs
kubectl get resourcegraphdefinition

# Describe specific RGD
kubectl describe resourcegraphdefinition my-rgd

# Check for validation errors
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.conditions}'
```

ResourceGraphDefinitions には 3 つの主要なステータス条件があります。
+  `ResourceGraphAccepted` - RGD が検証 (CEL 構文、型チェック、フィールドの存在) に合格したかどうか
+  `KindReady` - カスタム API の CRD が生成され、登録されたかどうか
+  `ControllerReady` - kro がカスタム API のインスタンスをアクティブに監視しているかどうか

`ResourceGraphAccepted` が `False` の場合は、不明なフィールド、型の不一致、循環依存関係などの検証エラーがないか、条件メッセージを確認します。

## インスタンスは作成されているが、基盤となるリソースが表示されない
<a name="_instances_created_but_underlying_resources_not_appearing"></a>

カスタムリソースインスタンスが存在するにもかかわらず、基盤となる Kubernetes リソース (デプロイ、サービス、ConfigMaps) が作成されていない場合は、kro にアクセス許可があることを確認し、構成エラーがないかを確認します。

 **インスタンスのステータスの確認**:

```
# Describe the instance (replace with your custom resource kind and name)
kubectl describe custom-kind
         my-instance

# View instance events
kubectl get events --field-selector involvedObject.name=my-instance

# Check instance status conditions
kubectl get custom-kind
         my-instance -o jsonpath='{.status.conditions}'

# Check instance state
kubectl get custom-kind
         my-instance -o jsonpath='{.status.state}'
```

インスタンスには、高レベルのステータスを示す次の `state` フィールドがあります。
+  `ACTIVE` - インスタンスは正常に実行されています。
+  `IN_PROGRESS` - インスタンスは処理中または調整中です。
+  `FAILED` - インスタンスの調整に失敗しました。
+  `DELETING` - インスタンスを削除中です。
+  `ERROR` - 処理中にエラーが発生しました。

インスタンスには、次の 4 つのステータス条件もあります。
+  `InstanceManaged` - ファイナライザーとラベルが適切に設定されています。
+  `GraphResolved` - ランタイムグラフが作成され、リソースが解決されています。
+  `ResourcesReady` - すべてのリソースが作成され、準備完了です。
+  `Ready` - インスタンス全体のヘルス (すべてのサブ条件が `True`の場合にのみ `True` になります)。

インスタンスのヘルスを判断するには、`Ready` 条件に注目します。`Ready` が `False` の場合は、サブ条件を確認して、どのフェーズで失敗したかを特定します。

 **RBAC アクセス許可の確認**:

kro 機能には、ResourceGraphDefinitions で定義されている基盤となる Kubernetes リソースを作成するためのアクセス許可が必要です。

```
# Check if the capability has the AmazonEKSClusterAdminPolicy
kubectl get accessentry -A | grep kro
```

アクセス許可がない場合は、`AmazonEKSClusterAdminPolicy` を kro 機能のアクセスエントリに関連付けるか、本番稼働用のより制限の厳しい RBAC ポリシーを作成します。詳細については、「[kro アクセス許可の設定](kro-permissions.md)」を参照してください。

## CEL 式のエラー
<a name="_cel_expression_errors"></a>

CEL 式のエラーは、インスタンスの作成時ではなく、ResourceGraphDefinition の作成時に検出されます。kro は、RGD の作成時に、すべての CEL 構文を検証し、Kubernetes スキーマに対して式の型チェックを行い、フィールドの存在を検証します。

 **一般的な CEL 検証エラー**:
+  **未定義のフィールド参照**: スキーマまたはリソースに存在しないフィールドを参照しています。
+  **型の不一致**: 式が期待される型と異なる型 (例: 整数が期待される箇所で文字列) を返します。
+  **無効な構文**: CEL 式に括弧、引用符、または演算子がありません。
+  **不明なリソースタイプ**: クラスターに存在しない CRD を参照しています。

 **RGD の検証ステータスの確認**:

```
# Check if RGD was accepted
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.conditions[?(@.type=="ResourceGraphAccepted")]}'

# View detailed validation errors
kubectl describe resourcegraphdefinition my-rgd
```

`ResourceGraphAccepted` が `False` の場合、条件メッセージには検証エラーが含まれます。

 **有効な CEL 式の例**:

```
# Reference schema field
${schema.spec.appName}

# Conditional expression
${schema.spec.replicas > 1}

# String template (expressions must return strings)
name: "${schema.spec.appName}-service"

# Standalone expression (can be any type)
replicas: ${schema.spec.replicaCount}

# Resource reference
${deployment.status.availableReplicas}

# Optional field access (returns null if field doesn't exist)
${configmap.data.?DATABASE_URL}
```

## リソースの依存関係が解決されない
<a name="_resource_dependencies_not_resolving"></a>

kro は CEL 式から依存関係を自動的に推測し、正しい順序でリソースを作成します。リソースが想定どおりに作成されていない場合は、依存関係の順序とリソースの準備状況を確認してください。

 **計算された作成順序の表示**:

```
# See the order kro will create resources
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.topologicalOrder}'
```

これは、リソース間の CEL 式の参照に基づいて計算された順序を示しています。

 **リソースの準備状況の確認**:

```
# View instance status to see which resources are ready
kubectl get custom-kind
         my-instance -o jsonpath='{.status}'

# Check specific resource status
kubectl get deployment my-deployment -o jsonpath='{.status.conditions}'
```

 **readyWhen 条件の確認 (使用している場合)**:

`readyWhen` フィールドはオプションです。指定しない場合、リソースは作成直後に準備完了とみなされます。`readyWhen` 条件を定義している場合は、リソースの準備状況が正しくチェックされていることを確認します。

```
resources:
  - id: deployment
    readyWhen:
      - ${deployment.status.availableReplicas == deployment.spec.replicas}
```

 **リソースイベントの確認**:

```
# View events for the underlying resources
kubectl get events -n namespace --sort-by='.lastTimestamp'
```

## スキーマ検証の失敗
<a name="_schema_validation_failures"></a>

スキーマ検証エラーが原因でインスタンスの作成に失敗した場合は、インスタンスが RGD スキーマの要件と一致していることを確認します。

 **検証エラーの確認**:

```
# Attempt to create instance and view error
kubectl apply -f instance.yaml

# View existing instance validation status
kubectl describe custom-kind
         my-instance | grep -A 5 "Validation"
```

 **一般的な検証の問題**:
+  **必須フィールドがない**: インスタンスがすべての必須スキーマフィールドを提供していません。
+  **型の不一致**: 整数が期待される箇所で文字列が指定されています。
+  **無効な列挙値**: 許可されているリストに含まれていない値が使用されています。
+  **パターンの不一致**: 文字列が正規表現パターンと一致していません。

 **RGD スキーマの確認**:

```
# View the schema definition
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.spec.schema}'
```

インスタンスで、正しい型の必須フィールドがすべて指定されていることを確認します。

## 次のステップ
<a name="_next_steps"></a>
+  [EKS を利用する場合の kro の考慮事項](kro-considerations.md) - kro の考慮事項とベストプラクティス
+  [kro アクセス許可の設定](kro-permissions.md) - プラットフォームチームとアプリケーションチームに RBAC を設定する
+  [kro の概念](kro-concepts.md) - kro の概念とリソースライフサイクルを理解する
+  [EKS 機能をトラブルシューティングする](capabilities-troubleshooting.md) - 一般的な機能をトラブルシューティングする際のガイダンス

# EKS Capability for kro とセルフマネージド kro の比較
<a name="kro-comparison"></a>

EKS Capability for kro は、セルフマネージド kro と同じ機能を提供しますが、運用上の大きな利点があります。EKS 機能とセルフマネージドソリューションの全般的な比較については、「[EKS 機能と考慮事項](capabilities-considerations.md)」を参照してください。

EKS Capability for kro は、同じアップストリームの kro コントローラーを使用し、アップストリームの kro と完全に互換性があります。ResourceGraphDefinitions、CEL 式、およびリソース構成は同じように機能します。完全な kro のドキュメントと例については、[kro ドキュメント](https://kro.run/docs/overview)を参照してください。

## 移行パス
<a name="_migration_path"></a>

セルフマネージド kro からマネージド機能にダウンタイムなしで移行できます。

**重要**  
移行する前に、セルフマネージド kro コントローラーが EKS Capability for kro と同じバージョンで実行されていることを確認します。EKS コンソールまたは `aws eks describe-capability` を使用して機能バージョンを確認し、そのバージョンに一致するようにセルフマネージドのインストールをアップグレードします。これにより、移行中の互換性の問題を防ぐことができます。

1. リーダー選出リースに `kube-system` を使用するようにセルフマネージド kro コントローラーを更新します。

   ```
   helm upgrade --install kro \
     oci://ghcr.io/awslabs/kro/kro-chart \
     --namespace kro \
     --set leaderElection.namespace=kube-system
   ```

   これにより、コントローラーのリースが `kube-system` に移動するため、マネージド機能がコントローラーを調整できるようになります。

1. クラスターに kro 機能を作成します (「[kro 機能の作成](create-kro-capability.md)」を参照)。

1. マネージド機能が既存の ResourceGraphDefinitions とインスタンスを認識して、調整を引き継ぎます。

1. セルフマネージド kro のデプロイを段階的にスケールダウンするか、削除します。

   ```
   helm uninstall kro --namespace kro
   ```

このアプローチにより、移行中、両方のコントローラーを安全に共存させることができます。マネージド機能がこれまでセルフマネージド kro で管理されていた ResourceGraphDefinitions とインスタンスを自動的に採用するので、引き続き競合なく調整を図ることができます。

## 次のステップ
<a name="_next_steps"></a>
+  [kro 機能の作成](create-kro-capability.md) - kro の機能リソースを作成する
+  [kro の概念](kro-concepts.md) - kro の概念とリソース構成を理解する

# EKS 機能をトラブルシューティングする
<a name="capabilities-troubleshooting"></a>

このトピックでは、機能のヘルスチェック、よくある問題、機能固有のトラブルシューティングへのリンクなど、EKS 機能に関する一般的なトラブルシューティングのガイダンスを示します。

**注記**  
EKS の機能は完全に管理され、クラスターの外部で実行されます。コントローラーのログや名前空間にアクセスすることはできません。トラブルシューティングでは、機能のヘルス、リソースのステータス、設定に焦点を当てています。

## 一般的なトラブルシューティングのアプローチ
<a name="_general_troubleshooting_approach"></a>

EKS 機能をトラブルシューティングするときは、次の一般的なアプローチに従ってください。

1.  **機能のヘルスを確認する**: `aws eks describe-capability` を使用して、機能のステータスとヘルスに関する問題を表示します。

1.  **リソースのステータスを確認する**: 作成した Kubernetes リソース (CRD) のステータス条件とイベントを確認します。

1.  **IAM アクセス許可を確認する**: 機能ロールに必要なアクセス許可があることを確認します。

1.  **設定を確認する**: 機能固有の設定が適切であることを確認します。

## 機能のヘルスを確認する
<a name="_check_capability_health"></a>

すべての EKS 機能が、EKS コンソールと `describe-capability` API を介してヘルス情報を提供します。

 **コンソール:**

1. https://console.aws.amazon.com/eks/home\$1/clusters で Amazon EKS コンソールを開きます。

1. クラスター名を選択します。

1. **[オブザーバビリティ]** タブを選択します。

1. **[クラスターを監視する]** を選択します。

1. **[機能]** タブを選択すると、すべての機能のヘルスとステータスが表示されます。

[機能] タブには以下が表示されます。
+ 機能の名前とタイプ
+ 現在のステータス
+ ヘルスの問題とその説明

 **AWS CLI**:

```
aws eks describe-capability \
  --region region-code \
  --cluster-name my-cluster \
  --capability-name my-capability-name
```

レスポンスは以下のとおりです。
+  **status**: 機能の現在の状態 (`CREATING`、`ACTIVE`、`UPDATING`、`DELETING`、`CREATE_FAILED`、`UPDATE_FAILED`)
+  **health**: 機能が検出した問題などのヘルス情報

## 機能でよく見られるステータス
<a name="_common_capability_statuses"></a>

 **CREATING**: 機能のセットアップ中です。

 **ACTIVE**: 機能の実行中ですぐに使用できるようになります。リソースが想定どおりに動作しない場合は、リソースのステータスと IAM アクセス許可を確認してください。

 **UPDATING**: 設定変更の適用中です。ステータスが `ACTIVE` に戻るまで待ちます。

 **CREATE\$1FAILED** または **UPDATE\$1FAILED**: セットアップまたは更新でエラーが発生しました。詳細については、ヘルスに関するセクションを確認してください。一般的な原因:
+ IAM ロールの信頼ポリシーが正しくないか、見つかりません。
+ IAM ロールが存在しないか、アクセスできません。
+ クラスターアクセスに問題があります。
+ 設定パラメータが無効です。

## Kubernetes リソースのステータスを確認する
<a name="_verify_kubernetes_resource_status"></a>

EKS 機能は、クラスターで Kubernetes カスタムリソース定義 (CRD) を作成および管理します。トラブルシューティングするときは、作成したリソースのステータスを確認してください。

```
# List resources of a specific type
kubectl get resource-kind -A

# Describe a specific resource to see conditions and events
kubectl describe resource-kind
         resource-name -n namespace

# View resource status conditions
kubectl get resource-kind
         resource-name -n namespace -o jsonpath='{.status.conditions}'

# View events related to the resource
kubectl get events --field-selector involvedObject.name=resource-name -n namespace
```

リソースのステータス条件では、以下の情報を確認できます。
+ リソースの準備ができているかどうか
+ 何かエラーが発生しているか
+ 現在の調整状態

## IAM アクセス許可とクラスターアクセスを確認する
<a name="_review_iam_permissions_and_cluster_access"></a>

機能で発生する問題の多くは、IAM アクセス許可に問題があるか、クラスターアクセス設定が欠落していることに起因しています。機能ロールのアクセス許可とクラスターアクセスのエントリの両方を検証します。

### IAM ロール許可をチェックする
<a name="_check_iam_role_permissions"></a>

必要なアクセス許可が機能ロールに付与されていることを確認します。

```
# List attached managed policies
aws iam list-attached-role-policies --role-name my-capability-role

# List inline policies
aws iam list-role-policies --role-name my-capability-role

# Get specific policy details
aws iam get-role-policy --role-name my-capability-role --policy-name policy-name

# View the role's trust policy
aws iam get-role --role-name my-capability-role --query 'Role.AssumeRolePolicyDocument'
```

この信頼ポリシーは、`capabilities.eks.amazonaws.com` サービスプリンシパルを許可する必要があります。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "capabilities.eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

### EKS アクセスエントリとアクセスポリシーを確認する
<a name="_check_eks_access_entries_and_access_policies"></a>

どの機能でも、動作しているクラスターで適切な EKS アクセスエントリとアクセスポリシーが必要です。

 **アクセスエントリが存在することを確認する**:

```
aws eks list-access-entries \
  --cluster-name my-cluster \
  --region region-code
```

リスト内で機能ロール ARN を探します。見つからない場合、機能はクラスターにアクセスできません。

 **エントリにアタッチされているアクセスポリシーを確認する**:

```
aws eks list-associated-access-policies \
  --cluster-name my-cluster \
  --principal-arn arn:aws:iam::111122223333:role/my-capability-role \
  --region region-code
```

どの機能にも、適切なアクセスポリシーが必要です。
+  **ACK**: Kubernetes リソースを作成および管理するためのアクセス許可が必要です。
+  **kro**: Kubernetes リソースを作成および管理するためのアクセス許可が必要です。
+  **Argo CD**: Application を作成および管理するためのアクセス許可が必要です。また、マルチクラスターのデプロイには、リモートターゲットクラスターにアクセスエントリが必要です。

 **Argo CD によるマルチクラスターのデプロイの場合**:

リモートクラスターにデプロイする場合は、ターゲットクラスターごとに機能ロールのアクセスエントリがあることを確認します。

```
# Check Access Entry on target cluster
aws eks describe-access-entry \
  --cluster-name target-cluster \
  --principal-arn arn:aws:iam::111122223333:role/argocd-capability-role \
  --region region-code
```

ターゲットクラスターにアクセスエントリがない場合、Argo CD はそのクラスターにアプリケーションをデプロイできません。設定の詳細については、「[ターゲットクラスターを登録する](argocd-register-clusters.md)」を参照してください。

## 機能に固有のトラブルシューティング
<a name="_capability_specific_troubleshooting"></a>

各機能タイプに固有の詳しいトラブルシューティングガイダンスについては、以下を参照してください。
+  [ACK 機能に関する問題をトラブルシューティングする](ack-troubleshooting.md) - ACK リソースの作成、IAM アクセス許可、クロスアカウントアクセスをトラブルシューティングします。
+  [Argo CD 機能に関する問題をトラブルシューティングする](argocd-troubleshooting.md) - アプリケーション同期、リポジトリ認証、マルチクラスターデプロイをトラブルシューティングします。
+  [kro 機能に関する問題をトラブルシューティングする](kro-troubleshooting.md) - ResourceGraphDefinitions、CEL 式、RBAC アクセス許可をトラブルシューティングします。

## すべての機能に共通する問題
<a name="_common_issues_across_all_capabilities"></a>

### CREATING 状態で機能が停止する
<a name="_capability_stuck_in_creating_state"></a>

機能が想定よりも長く `CREATING` 状態のままである場合:

1. コンソール (**[オブザーバビリティ]** > **[クラスターをモニタリング]** > **[機能]** タブ) または AWS CLI を使用して、機能のヘルスをチェックして特定の問題がないか確認します。

   ```
   aws eks describe-capability \
     --region region-code \
     --cluster-name my-cluster \
     --capability-name my-capability-name \
     --query 'capability.health'
   ```

1. IAM ロールが存在し、信頼ポリシーが適切であることを確認します。

1. クラスターがアクセス可能で正常であることを確認します。

1. 機能のセットアップを阻害するようなクラスターレベルの問題がないか確認します。

### リソースが作成または更新されない
<a name="_resources_not_being_created_or_updated"></a>

機能が `ACTIVE` であるのにリソースが作成または更新されない場合:

1. リソースのステータスをチェックしてエラー条件を確認します。

1. 特定の AWS サービス (ACK) またはリポジトリ (Argo CD) に対する IAM アクセス許可を検証します。

1. 基礎となるリソース (kro) を作成するための RBAC アクセス許可を確認します。

1. リソース仕様をチェックして検証エラーがないか確認します。

### 機能のヘルスに問題がある
<a name="_capability_health_shows_issues"></a>

`describe-capability` がヘルスの問題を示している場合:

1. 問題の説明を注意深く読みます。具体的な問題を示していることがよくあります。

1. 根本原因 (IAM アクセス許可や設定エラーなど) に対処します。

1. 問題が解決すると、機能は自動的に復旧します。

## 次のステップ
<a name="_next_steps"></a>
+  [機能リソースの使用](working-with-capabilities.md) - 機能リソースを管理する
+  [ACK 機能に関する問題をトラブルシューティングする](ack-troubleshooting.md) - ACK に固有のトラブルシューティングを行う
+  [Argo CD 機能に関する問題をトラブルシューティングする](argocd-troubleshooting.md) - Argo CD に固有のトラブルシューティングを行う
+  [kro 機能に関する問題をトラブルシューティングする](kro-troubleshooting.md) - kro に固有のトラブルシューティングを行う
+  [EKS 機能のセキュリティに関する考慮事項](capabilities-security.md) - 機能のセキュリティ面のベストプラクティス