

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

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

# 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/) - 詳細なアップストリームリファレンス