

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

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

# Argo CD プロジェクトを操作する
<a name="argocd-projects"></a>

Argo CD プロジェクト (AppProject) では、アプリケーションを論理的にグループ化して、アクセスコントロールを付与できます。プロジェクトは、アプリケーションが使用できる Git リポジトリ、ターゲットクラスター、名前空間を定義して、共有 Argo CD インスタンスにマルチテナンシーとセキュリティの境界を確立します。

## どのような場合にプロジェクトを使用するか
<a name="_when_to_use_projects"></a>

プロジェクトを使用すると、以下のことが行えます。
+ チーム、環境、またはビジネスユニットごとにアプリケーションを分離します。
+ チームがどのリポジトリからデプロイできるかを制限します。
+ チームがどのクラスターと名前空間にデプロイできるかを制限します。
+ リソースクォータと許可されたリソースタイプを適用します。
+ ガードレールに沿ってセルフサービスアプリケーションをデプロイします。

## デフォルトプロジェクト
<a name="_default_project"></a>

すべての Argo CD 機能に `default` プロジェクトがあり、すべてのリポジトリ、クラスター、名前空間へのアクセスを許可する設定になっています。初期テストには有用ですが、本番稼働に使用する場合は制限を明記した専用のプロジェクトを作成します。

デフォルトプロジェクトの設定とその制限方法の詳細については、Argo CD ドキュメントの「[デフォルトプロジェクト](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#the-default-project)」を参照してください。

## プロジェクトの作成
<a name="_create_a_project"></a>

プロジェクトを作成するには、クラスターに `AppProject` リソースを適用します。

 **例: チーム固有のプロジェクト** 

```
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'


  # Source namespaces (required for EKS capability)
  sourceNamespaces:
    - argocd
    - team-a-dev
    - team-a-prod

  # 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
```

プロジェクトを適用します。

```
kubectl apply -f team-a-project.yaml
```

## プロジェクトの設定
<a name="_project_configuration"></a>

### ソースリポジトリ
<a name="_source_repositories"></a>

このプロジェクトのアプリケーションが使用できる Git リポジトリを制御します。

```
spec:
  sourceRepos:
    - 'https://github.com/my-org/app-*'  # Wildcard pattern
    - 'https://github.com/my-org/infra'  # Specific repo
```

ワイルドカードと否定パターン (`!` プレフィックス) を使用すると、特定のリポジトリを許可または拒否できます。詳細については、Argo CD ドキュメントの [プロジェクトの管理](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#managing-projects) を参照してください。

### ソース名前空間
<a name="_source_namespaces"></a>

EKS Argo CD 機能を使用する場合は、カスタム AppProject 定義に `spec.sourceNamespaces` フィールドが **必要** です。このフィールドは、このプロジェクトを参照するアプリケーションまたは ApplicationSet を含めることができる名前空間を指定します。

**重要**  
これは EKS Argo CD 機能の必須フィールドです。このフィールドがオプションである OSS Argo CD とは異なります。

#### デフォルトの AppProject の動作
<a name="_default_appproject_behavior"></a>

`default` AppProject には、`sourceNamespaces` の `argocd` 名前空間が自動的に含まれます。追加の名前空間でアプリケーションまたは ApplicationSets を作成する必要がある場合は、`sourceNamespaces` フィールドを変更してそれらの名前空間を追加します。

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: default
  namespace: argocd
spec:
  sourceNamespaces:
    - argocd           # Already included by default
    - team-a-apps      # Add additional namespaces as needed
    - team-b-apps
```

#### カスタム AppProject の設定
<a name="_custom_appproject_configuration"></a>

カスタム AppProject を作成するときは、`argocd` システム名前空間と、アプリケーションまたは ApplicationSets を作成する予定のその他の名前空間を手動で含める必要があります。

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a-project
  namespace: argocd
spec:
  description: Applications for Team A

  # Required: Manually specify all namespaces
  sourceNamespaces:
    - argocd           # ArgoCD system namespace (required)
    - team-a-dev       # Custom namespace for dev Applications
    - team-a-prod      # Custom namespace for prod Applications

  # Source repositories this project can deploy from
  sourceRepos:
    - 'https://github.com/my-org/team-a-*'

  # Destination restrictions
  destinations:
    - namespace: 'team-a-*'
      server: https://kubernetes.default.svc
```

**注記**  
`sourceNamespaces` から名前空間を省略した場合、その名前空間で作成されたアプリケーションまたは ApplicationSets はこのプロジェクトを参照できなくなり、デプロイが失敗します。

### 送信先の制限
<a name="_destination_restrictions"></a>

アプリケーションがデプロイできる場所を制限します。

```
spec:
  destinations:
    - name: prod-cluster  # Specific cluster by name
      namespace: production
    - name: '*'  # Any cluster
      namespace: team-a-*  # Namespace pattern
```

**重要**  
本番稼働のプロジェクトでは、ワイルドカードではなく、特定のクラスター名と名前空間パターンを使用します。これにより、不正なクラスターや名前空間が偶発的にデプロイされるのを防ぐことができます。

ワイルドカードと否定パターンを使用して、送信先を制御できます。詳細については、Argo CD ドキュメントの「[プロジェクトの管理](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
```

## プロジェクトにアプリケーションを割り当てる
<a name="_assign_applications_to_projects"></a>

アプリケーションを作成するときは、`spec.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
```

アプリケーションにプロジェクトを指定しないと、`default` プロジェクトが使用されます。

## プロジェクトのロールと RBAC
<a name="_project_roles_and_rbac"></a>

プロジェクトでは、カスタムロールを定義して、アクセスコントロールをきめ細かく設定できます。機能設定でプロジェクトのロールを AWS アイデンティティセンターのユーザーとグループにマッピングすると、アプリケーションを同期、更新、または削除できるユーザーを制御できます。

 **例: プロジェクトに開発者ロールと管理者ロールを付与する** 

```
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
```

プロジェクトのロール、CI/CD パイプラインの JWT トークン、および RBAC 設定の詳細については、Argo CD ドキュメントの「[プロジェクトのロール](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#project-roles)」を参照してください。

## 一般的なパターン
<a name="_common_patterns"></a>

### 環境ベースのプロジェクト
<a name="_environment_based_projects"></a>

環境ごとにプロジェクトを作成します。

```
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
```

### チームベースのプロジェクト
<a name="_team_based_projects"></a>

専用のプロジェクトでチームを分離します。

```
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: '*'
```

### マルチクラスターのプロジェクト
<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>

 **制限のあるプロジェクトから始める**: 最初から幅広いアクセスを付与するのではなく、絞り込んだアクセス許可から始め、必要に応じて拡張します。

 **名前空間パターンを使用する**: 名前空間の制限 (`team-a-*` など) にワイルドカードを活用して、境界を維持しながら柔軟性を確保します。

 **本番稼働用のプロジェクトを分離する**: 本番稼働専用のプロジェクトを使用する場合は、制御を厳格にし、手動同期ポリシーを実施します。

 **プロジェクトの目的を文書化する**: `description` フィールドを使用して、各プロジェクトの目的と誰が使用すべきかを説明します。

 **プロジェクトのアクセス許可を定期的に見直す**: プロジェクトを定期的に監査して、制限がチームのニーズとセキュリティ要件に沿っていることを確認します。

## その他のリソース
<a name="_additional_resources"></a>
+  [Argo CD アクセス許可を設定する](argocd-permissions.md) - RBAC とアイデンティティセンターとの統合を設定する
+  [Application を作成する](argocd-create-application.md) - プロジェクト内にアプリケーションを作成する
+  [ApplicationSet を使用する](argocd-applicationsets.md) - プロジェクトで ApplicationSet を使用してマルチクラスターデプロイを実施する
+  [Argo CD プロジェクトドキュメント](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/) - 詳細なアップストリームリファレンス