

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# Argo CD를 사용하는 지속적 배포
<a name="argocd"></a>

Argo CD는 Kubernetes에 대한 선언에 기반한 GitOps의 지속적 전송 도구입니다. Argo CD를 사용하면 여러 클러스터 및 환경에서 애플리케이션의 배포 및 수명 주기 관리를 자동화할 수 있습니다. Argo CD는 Git 리포지토리, 헬름 레지스트리(HTTP 및 OCI), OCI 이미지를 비롯한 여러 소스 유형을 지원하므로 보안 및 규정 준수 요구 사항이 서로 다른 조직에 유연성을 제공합니다.

EKS 기능을 사용하면 Argo CD는 AWS에서 완전하게 관리되므로 클러스터에서 Argo CD 컨트롤러 및 해당 종속성을 설치, 유지 관리 및 조정할 필요가 없습니다.

## Argo CD 작동 방식
<a name="_how_argo_cd_works"></a>

Argo CD는 GitOps 패턴을 따릅니다. 이때 애플리케이션 소스(Git 리포지토리, 헬름 레지스트리 또는 OCI 이미지)는 원하는 애플리케이션 상태를 정의하기 위한 신뢰할 수 있는 소스입니다. Argo CD `Application` 리소스를 생성할 때 애플리케이션 매니페스트와 대상 Kubernetes 클러스터 및 네임스페이스를 포함하는 소스를 지정합니다. Argo CD는 클러스터의 소스 및 라이브 상태를 지속적으로 모니터링하므로 변경 사항을 자동으로 동기화하여 클러스터 상태가 원하는 상태와 일치하는지 확인합니다.

**참고**  
Argo CD의 EKS 기능을 사용하면 Argo CD 소프트웨어는 워커 노드가 아닌 AWS 컨트롤 플레인에서 실행됩니다. 즉, 워커 노드는 Git 리포지토리 또는 헬름 레지스트리에 직접 액세스할 필요가 없습니다. 이 기능은 AWS 계정의 소스 액세스를 처리합니다.

Argo CD는 다음과 같은 세 가지 기본 리소스 유형을 제공합니다.
+  **Application**: Git 리포지토리에서 대상 클러스터로의 배포를 정의함
+  **ApplicationSet**: 다중 클러스터 배포를 위해 템플릿에서 여러 애플리케이션을 생성함
+  **AppProject**: 애플리케이션에 대한 논리적 그룹화 및 액세스 제어를 제공함

 **예제: Argo CD 애플리케이션 생성** 

다음 예제에서는 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>

Argo CD는 Git 리포지토리에서 애플리케이션 구성을 정의하는 GitOps 워크플로를 구현하고, Argo CD는 원하는 상태와 일치하도록 애플리케이션을 자동으로 동기화합니다. 이 Git 중심 접근 방식은 모든 변경 사항에 대한 완전한 감사 추적을 제공하고 쉬운 롤배을 지원하며 기존 코드 검토 및 승인 프로세스와 자연스럽게 통합됩니다. Argo CD는 Git의 원하는 상태와 클러스터의 실제 상태 사이의 드리프트를 자동으로 감지하고 조정하여 선언된 구성과 일관되게 배포를 유지합니다.

Argo CD를 사용하면 단일 Argo CD 인스턴스의 여러 클러스터에서 애플리케이션을 배포 및 관리할 수 있으므로 다중 클러스터 및 다중 리전 환경에서 작업을 단순화할 수 있습니다. Argo CD UI는 시각화 및 모니터링 기능을 제공하여 애플리케이션의 배포 상태, 상태 및 기록을 볼 수 있습니다. UI는 원활한 인증 및 권한 부여를 위해 AWS Identity Center(이전의 AWS SSO)에 통합되어 기존 ID 관리 인프라를 사용하여 액세스를 제어할 수 있습니다.

EKS 관리형 기능의 일환으로 Argo CD는 AWS에서 완전하게 관리되므로 Argo CD 인프라를 설치, 구성 및 유지 관리할 필요가 없습니다. AWS에서 조정, 패치 적용 및 운영 관리를 처리하므로 팀은 도구 유지 관리가 아닌 애플리케이션 제공에 집중할 수 있습니다.

## AWS Identity Center와 통합
<a name="integration_with_shared_aws_identity_center"></a>

EKS 관리형 기능은 Argo CD와 AWS Identity Center 간 직접 통합을 제공하여 사용자에게 원활한 인증 및 권한 부여를 지원합니다. Argo CD 기능을 활성화하면 Identity Center 그룹 및 사용자를 Argo CD RBAC 역할에 매핑하도록 AWS Identity Center 통합을 구성하여 Argo CD에서 애플리케이션에 액세스하고 이를 관리할 수 있는 사용자를 제어할 수 있습니다.

## 다른 EKS 관리형 기능과 통합
<a name="_integration_with_other_eks_managed_capabilities"></a>

Argo CD는 다른 EKS 관리형 기능과 통합됩니다.
+  ** AWS Controllers for Kubernetes(ACK)**: Argo CD를 사용하여 여러 클러스터에서 ACK 리소스 배포를 관리하여 AWS 인프라에 대한 GitOps 워크플로를 지원합니다.
+  **Kube Resource Orchestrator(kro)**: Argo CD를 사용하여 여러 클러스터에 kro 구성을 배포하므로 Kubernetes 자산 전반에서 일관된 리소스 구성을 사용할 수 있습니다.

## Argo CD 시작하기
<a name="_getting_started_with_argo_cd"></a>

Argo CD의 EKS 기능을 시작하는 방법:

1. Argo CD가 소스에 액세스하고 애플리케이션을 관리하는 데 필요한 권한이 있는 IAM 기능 역할을 생성 및 구성하세요.

1.  AWS 콘솔, AWS CLI 또는 기본 코드형 인프라를 통해 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 Identity Center** - Argo CD 인증에 필요(로컬 사용자는 지원되지 않음)
+ Argo CD에 대한 권한이 있는 IAM 기능 역할
+ EKS 클러스터에서 기능 리소스를 생성할 수 있는 충분한 IAM 권한
+  클러스터와 통신하도록 구성된 `kubectl`
+ (선택 사항) 더 쉬운 클러스터 및 리포지토리 관리를 위해 설치된 Argo CD CLI
+ (CLI/eksctl의 경우) 설치 및 구성된 적절한 CLI 도구

IAM 기능 역할을 생성하는 방법에 대한 지침은 [Amazon EKS 기능 IAM 역할](capability-role.md) 섹션을 참조하세요. Identity Center 설정에 대한 자세한 내용은 [Getting started with AWS Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)를 참조하세요.

**중요**  
사용자가 제공하는 IAM 기능 역할에 따라 Argo CD에서 액세스할 수 있는 AWS 리소스가 결정됩니다. 여기에는 CodeConnections를 통한 Git 리포지토리 액세스와 Secrets Manager의 보안 암호가 포함됩니다. 최소 권한으로 적절한 역할을 생성하는 방법에 대한 지침은 [Amazon EKS 기능 IAM 역할](capability-role.md) 및 [EKS 기능에 대한 보안 고려 사항](capabilities-security.md) 섹션을 참조하세요.

## 도구 선택
<a name="_choose_your_tool"></a>

AWS Management Console, 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에서 사용자 지정 리소스(Applications, ApplicationSets, AppProjects) 감시를 시작함

1. 기능 상태가 `CREATING`에서 `ACTIVE`로 변경됨 

1. 해당 URL을 통해 Argo CD UI에 액세스할 수 있음

활성 상태가 되면 클러스터에서 Argo CD 애플리케이션을 생성하여 선언적 소스에서 배포할 수 있습니다.

**참고**  
자동으로 생성된 액세스 항목은 클러스터에 애플리케이션을 배포하기 위한 권한을 부여하지 않습니다. 애플리케이션을 배포하려면 각 대상 클러스터에 대해 추가 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) - 리포지토리 액세스 구성, 대상 클러스터 등록, 애플리케이션 생성
+  [Argo CD 고려 사항](argocd-considerations.md) - 다중 클러스터 아키텍처 패턴 및 고급 구성 살펴보기

# 콘솔을 사용하여 Argo CD 기능 생성
<a name="argocd-create-console"></a>

이 주제에서는 AWS Management Console을 사용하여 Argo CD 기능을 생성하는 방법을 설명합니다.

## 사전 조건
<a name="_prerequisites"></a>
+  **구성된 AWS Identity Center** - Argo CD에는 인증을 위해 AWS Identity Center가 필요합니다. 로컬 사용자는 지원되지 않습니다. AWS Identity Center를 설정하지 않은 경우 [Getting started with AWS Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)를 참조하여 Identity Center 인스턴스를 생성하고 [사용자 추가](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 역할 생성** 선택 

     그러면 Secrets Manager에 대한 전체 읽기 액세스 권한과 함께 신뢰 정책이 미리 채워진 새 탭에서 IAM 콘솔이 열립니다. 다른 권한은 기본적으로 추가되지 않지만 필요한 경우 추가할 수 있습니다. CodeCommit 리포지토리 또는 기타 AWS 서비스를 사용하려는 경우 역할을 생성하기 전에 적절한 권한을 추가합니다.

     역할을 생성한 후 EKS 콘솔로 돌아가면 역할이 자동으로 선택됩니다.
**참고**  
AWS Secrets Manager 또는 AWS CodeConnections와의 선택적 통합을 사용하려는 경우 역할에 권한을 추가해야 합니다. IAM 정책 예제 및 구성 지침은 [AWS Secrets Manager를 사용하여 애플리케이션 보안 암호 관리](integration-secrets-manager.md) 및 [AWS CodeConnections를 사용하여 Git 리포지토리에 연결](integration-codeconnections.md) 섹션을 참조하세요.

1. AWS Identity Center 통합을 구성하세요.

   1. **AWS Identity Center 통합 활성화**를 선택하세요.

   1. 드롭다운에서 Identity Center 인스턴스를 선택하세요.

   1. Argo CD 역할(ADMIN, EDITOR 또는 VIEWER)에 사용자 또는 그룹을 할당하여 RBAC에 대한 역할 매핑을 구성하세요.

1. **생성(Create)**을 선택합니다.

기능 생성 프로세스가 시작됩니다.

## 기능이 활성 상태인지 확인
<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) - 리포지토리 구성, 클러스터 등록, 애플리케이션 생성
+  [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 Identity Center** - Argo CD에는 인증을 위해 AWS Identity Center가 필요합니다. 로컬 사용자는 지원되지 않습니다. AWS Identity Center를 설정하지 않은 경우 [Getting started with AWS Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)를 참조하여 Identity Center 인스턴스를 생성하고 [사용자 추가](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 기능 리소스를 생성합니다.

먼저 Identity Center 구성에 대한 환경 변수를 설정합니다.

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

Identity Center 통합을 사용하여 기능을 생성합니다. *region-code*를 클러스터가 위치한 AWS 리전으로 바꾸고 *my-cluster*를 클러스터 이름으로 바꾸며 *idc-region-code*를 IAM Identity Center가 구성된 리전 코드로 바꿉니다.

```
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) - 리포지토리 구성, 클러스터 등록, 애플리케이션 생성
+  [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 Identity Center 구성 가져오기
<a name="step_2_get_your_shared_aws_identity_center_configuration"></a>

RBAC 구성을 위해 Identity Center 인스턴스 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, Identity Center 인스턴스 ARN, Identity Center 리전 및 사용자 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 애플리케이션을 생성하고 관리하는 방법 알아보기
+  [Argo CD 고려 사항](argocd-considerations.md) - SSO 및 다중 클러스터 액세스 구성
+  [기능 리소스 작업](working-with-capabilities.md) - Argo CD 기능 리소스 관리

# Argo CD 개념
<a name="argocd-concepts"></a>

Argo CD는 Git을 애플리케이션 배포의 신뢰할 수 있는 단일 소스로 처리하여 GitOps를 구현합니다. 이 주제에서는 실제 예제를 살펴본 다음 Argo CD의 EKS 기능을 사용할 때 알아야 하는 핵심 개념을 설명합니다.

## Argo CD 시작하기
<a name="_getting_started_with_argo_cd"></a>

Argo CD 기능을 생성한 후([Argo CD 기능 생성](create-argocd-capability.md) 참조) 애플리케이션 배포를 시작할 수 있습니다. 이 예제에서는 클러스터를 등록하고 애플리케이션을 생성하는 방법을 안내합니다.

### 1단계: 설정
<a name="_step_1_set_up"></a>

 **클러스터 등록**(필수)

애플리케이션을 배포할 클러스터를 등록합니다. 이 예제에서는 Argo CD가 실행 중인 동일한 클러스터를 등록합니다(대부분의 Argo CD 예제와 호환 가능하도록 `in-cluster` 이름 사용).

```
# 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 서비스(헬름 차트, CodeConnections 및 CodeCommit에 대한 ECR)의 경우 리포지토리를 생성하지 않고도 애플리케이션 리소스에서 직접 참조할 수 있습니다. 용량 역할에는 필요한 IAM 권한이 있어야 합니다. 세부 정보는 [리포지토리 액세스 구성](argocd-configure-repositories.md) 섹션을 참조하세요.

### 단계 2: 애플리케이션 만들기
<a name="_step_2_create_an_application"></a>

`my-app.yaml`에서 이 애플리케이션 매니페스트를 생성합니다.

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

애플리케이션을 적용합니다.

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

이 애플리케이션을 적용한 후 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 매니페스트, 헬름 차트 또는 Kustomize 오버레이를 사용하여 선언됨
+  **버전 관리됨** - 모든 변경 사항은 전체 감사 추적을 통해 추적됨
+  **자동화됨** - Argo CD가 소스를 지속적으로 모니터링하고 변경 사항을 자동으로 동기화함
+  **자가 복구** - 원하는 클러스터 상태와 실제 클러스터 상태 사이의 드리프트를 감지하고 수정함

 **지원되는 소스 유형**:
+  **Git 리포지토리** - GitHub, GitLab, Bitbucket, CodeCommit(HTTPS, SSH 또는 CodeConnections)
+  **헬름 레지스트리** - HTTP 레지스트리(예: `https://aws.github.io/eks-charts`) 및 OCI 레지스트리(예: `public.ecr.aws`)
+  **OCI 이미지** - 매니페스트 또는 헬름 차트가 포함된 컨테이너 이미지(예: `oci://registry-1.docker.io/user/my-app`)

이러한 유연성을 통해 조직은 보안 및 규정 준수 요구 사항을 충족하는 소스를 선택할 수 있습니다. 예를 들어 클러스터에서 Git 액세스를 제한하는 조직은 헬름 차트 또는 OCI 이미지에 ECR을 사용할 수 있습니다.

자세한 내용은 Argo CD 설명서의 [Application Sources](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`과 같은 음수를 포함하여 작은 숫자부터)로 적용됩니다. 지정하지 않으면 Wave `0`이 기본값입니다. 이를 통해 서비스(wave `1`) 이전의 배포(wave `0`)보다 이전에 네임스페이스(wave `-1`)와 같은 종속성을 생성할 수 있습니다.

 **자가 복구**는 수동 변경 사항을 자동으로 되돌립니다.

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

**참고**  
관리형 기능은 Kubernetes 규칙 및 기타 도구와의 호환성 개선을 위해 주석 기반 리소스 추적(레이블 기반이 아님)을 사용합니다.

동기화 단계, 후크 및 고급 패턴에 대한 자세한 내용은 [Argo CD sync 설명서](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/)를 참조하세요.

### 애플리케이션 상태
<a name="_application_health"></a>

Argo CD는 애플리케이션에 있는 모든 리소스의 상태를 모니터링합니다.

 **상태**: \$1 **정상** - 모든 리소스가 예상대로 실행 중임 \$1 **진행 중** - 리소스가 생성 또는 업데이트 중임 \$1 **성능 저하됨** - 일부 리소스가 정상이 아님(포드 충돌, 작업 실패) \$1 **일시 중단됨** - 애플리케이션이 의도적으로 일시 중지됨 \$1 **누락** - Git에 정의된 리소스가 클러스터에 없음

Argo CD는 일반적인 Kubernetes 리소스(배포, StatefulSets, 작업 등)에 대한 기본 제공 상태 확인 기능을 보유하며, CRD에 대한 사용자 지정 상태 확인을 지원합니다.

애플리케이션 상태는 모든 리소스에 의해 결정됩니다. 리소스가 `Degraded`인 경우 애플리케이션은 `Degraded`입니다.

자세한 내용은 Argo CD 설명서의 [Resource Health](https://argo-cd.readthedocs.io/en/stable/operator-manual/health/)를 참조하세요.

### 다중 클러스터 패턴
<a name="_multi_cluster_patterns"></a>

Argo CD는 다음과 같은 두 가지 주요 배포 패턴을 지원합니다.

 **허브 및 스포크** 여러 워크로드 클러스터에 배포되는 전용 관리 클러스터에서 Argo CD 실행: \$1 중앙 집중식 제어 및 가시성 \$1 모든 클러스터에서 일관된 정책 \$1 관리할 하나의 Argo CD 인스턴스 \$1 컨트롤 플레인과 워크로드 간 명확한 분리

 **클러스터별** - 각 클러스터에서 Argo CD를 실행하여 해당 클러스터의 애플리케이션만 관리: \$1 클러스터 분리(한 곳의 장애는 다른 곳에 영향을 주지 않음) \$1 보다 간단한 네트워킹(클러스터 간 통신 없음) \$1 보다 쉬운 초기 설정(클러스터 등록 없음)

많은 클러스터를 관리하는 플랫폼 팀의 경우 허브 및 스포크를 선택하거나 독립된 팀이나 클러스터가 완전히 격리되어야 하는 경우 클러스터별 방법을 선택합니다.

자세한 다중 클러스터 구성은 [Argo CD 고려 사항](argocd-considerations.md) 섹션을 참조하세요.

### Projects
<a name="_projects"></a>

프로젝트는 애플리케이션에 대한 논리적 그룹화 및 액세스 제어를 제공합니다.
+  **소스 제한 사항** - 사용할 수 있는 Git 리포지토리 제한
+  **대상 제한 사항** - 대상으로 지정할 수 있는 클러스터 및 네임스페이스 제한
+  **리소스 제한 사항** - 배포할 수 있는 Kubernetes 리소스 유형 제한
+  **RBAC 통합** - AWS Identity Center 사용자 및 그룹 ID에 프로젝트 매핑

애플리케이션은 단일 프로젝트에 속해 있습니다. 지정하지 않으면 `default` 프로젝트(기본적으로 제한 사항 없음)를 사용합니다. 프로덕션에서 사용하는 경우 액세스를 제한하고 적절한 제한 사항으로 새 프로젝트를 생성하도록 `default` 프로젝트를 편집합니다.

프로젝트 구성 및 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 sync options 설명서](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) - 배포에 대한 대상 클러스터 등록
+  [애플리케이션 생성](argocd-create-application.md) - 첫 번째 애플리케이션 생성
+  [Argo CD 고려 사항](argocd-considerations.md) - EKS 특정 패턴, Identity Center 통합 및 다중 클러스터 구성
+  [Argo CD 설명서](https://argo-cd.readthedocs.io/en/stable/) - 동기화 후크, 상태 확인 및 고급 패턴을 포함하는 포괄적인 Argo CD 설명서

# Argo CD 권한 구성
<a name="argocd-permissions"></a>

Argo CD 관리형 기능은 인증을 위해 AWS Identity Center와 통합되며 권한 부여를 위해 기본 제공 RBAC 역할을 사용합니다. 이 주제에서는 사용자 및 팀에 대한 권한을 구성하는 방법을 설명합니다.

## Argo CD에서 권한이 작동하는 방식
<a name="_how_permissions_work_with_argo_cd"></a>

Argo CD 기능은 인증에 AWS Identity Center를 사용하고 권한 부여에 세 가지 기본 제공 RBAC 역할을 제공합니다.

사용자가 Argo CD에 액세스하는 경우:

1. 사용자는 AWS Identity Center(기업 ID 제공업체에 페더레이션할 수 있음)를 사용하여 인증함

1.  AWS Identity Center는 Argo CD에 사용자 및 그룹 정보를 제공함

1. Argo CD는 사용자 구성을 기반으로 사용자 및 그룹을 RBAC 역할에 매핑함

1. 사용자는 액세스 권한이 있는 애플리케이션 및 리소스만 볼 수 있음

## 기본 제공 RBAC 역할
<a name="_built_in_rbac_roles"></a>

Argo CD 기능은 AWS Identity Center 사용자 및 그룹에 매핑하는 세 가지 기본 제공 역할을 제공합니다. 이는 프로젝트, 클러스터 및 리포지토리와 같은 Argo CD 리소스에 대한 액세스를 제어하는 **글로벌 범위의 역할**입니다.

**중요**  
글로벌 역할은 애플리케이션과 같은 프로젝트 범위의 리소스가 아닌 Argo CD 자체에 대한 액세스를 제어합니다. EDITOR 및 VIEWER 사용자는 기본적으로 애플리케이션을 보거나 관리할 수 없으며, 프로젝트 범위의 리소스에 액세스하려면 프로젝트 역할이 필요합니다. 애플리케이션 및 기타 프로젝트 범위의 리소스 관련 액세스 권한 부여에 대한 자세한 내용은 [프로젝트 역할 및 프로젝트 범위 액세스](#project-roles) 섹션을 참조하세요.

 **ADMIN** 

모든 Argo CD 리소스 및 설정에 대한 전체 액세스:
+ Applications 및 ApplicationSets의 생성, 업데이트, 삭제
+ Argo CD 구성 관리
+ 배포 대상 클러스터 등록 및 관리
+ 리포지토리 액세스 구성
+ 프로젝트 생성 및 관리
+ 모든 애플리케이션 상태 및 기록 보기
+ 모든 클러스터 및 리포지토리의 나열 및 액세스

 **EDITOR** 

프로젝트를 업데이트하고 프로젝트 역할을 구성할 수 있지만 글로벌 Argo CD 설정은 변경할 수 없습니다.
+ 기존 프로젝트 업데이트(프로젝트를 생성하거나 삭제할 수 없음)
+ 프로젝트 역할 및 권한 구성
+ GPG 키 및 인증서 보기
+ 글로벌 Argo CD 구성을 변경할 수 없음
+ 클러스터 또는 리포지토리를 직접 관리할 수 없음
+ 프로젝트 역할 없이 애플리케이션을 보거나 관리할 수 없음

 **VIEWER** 

Argo CD 리소스에 대한 읽기 전용 액세스 권한:
+ 프로젝트 구성 보기
+ 모든 프로젝트(사용자가 할당되지 않은 프로젝트 포함) 나열
+ GPG 키 및 인증서 보기
+ 클러스터 또는 리포지토리를 나열할 수 없음
+ 변경할 수 없음
+ 프로젝트 역할 없이 애플리케이션을 보거나 관리할 수 없음

**참고**  
EDITOR 또는 VIEWER 사용자에게 애플리케이션에 대한 액세스 권한을 부여하려면 ADMIN 또는 EDITOR가 Identity Center 그룹을 프로젝트 내 특정 권한에 매핑하는 프로젝트 역할을 생성해야 합니다.

## 프로젝트 역할 및 프로젝트 범위 액세스
<a name="project-roles"></a>

글로벌 역할(ADMIN, EDITOR, VIEWER)은 Argo CD 자체에 대한 액세스를 제어합니다. 프로젝트 역할은 다음을 포함하여 특정 프로젝트 내 리소스 및 기능에 대한 액세스를 제어합니다.
+  **리소스**: 애플리케이션, ApplicationSets, 리포지토리 자격 증명, 클러스터 자격 증명
+  **기능**: 로그 액세스, 애플리케이션 포드에 대한 실행 액세스

 **2단계 권한 모델 이해**:
+  **글로벌 범위**: 기본 제공 역할은 사용자가 프로젝트, 클러스터, 리포지토리 및 Argo CD 설정으로 수행할 수 있는 작업을 결정함
+  **프로젝트 범위**: 프로젝트 역할은 사용자가 특정 프로젝트 내 리소스 및 기능으로 수행할 수 있는 작업을 결정함

이는 다음을 의미합니다.
+ ADMIN 사용자는 추가 구성 없이 모든 프로젝트 리소스 및 기능에 액세스할 수 있음
+ 프로젝트 리소스 및 기능에 액세스하려면 EDITOR 및 VIEWER 사용자에게 프로젝트 역할을 부여해야 함
+ EDITOR 사용자는 이들이 업데이트할 수 있는 프로젝트 내에서 자신과 다른 사용자에게 액세스 권한을 부여하기 위해 프로젝트 역할을 생성할 수 있음

 **워크플로 예제**:

1. ADMIN은 Identity Center 그룹을 글로벌 범위에서 EDITOR 역할에 매핑함

1. ADMIN은 팀에서 프로젝트를 생성함

1. EDITOR는 팀원에게 프로젝트 범위의 리소스에 대한 액세스 권한을 부여하도록 해당 프로젝트 내에서 프로젝트 역할을 구성함

1. 이제 팀원(VIEWER 글로벌 역할이 있을 수 있음)은 프로젝트 역할 권한을 기반으로 해당 프로젝트의 애플리케이션을 보고 관리할 수 있음

프로젝트 역할 구성에 대한 자세한 내용은 [프로젝트 기반 액세스 제어](#_project_based_access_control) 섹션을 참조하세요.

## 역할 매핑 구성
<a name="_configure_role_mappings"></a>

기능을 생성하거나 업데이트할 때 AWS Identity Center 사용자 및 그룹을 Argo CD 역할에 매핑합니다.

 **역할 매핑 예제**:

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["AdminGroup", "alice@example.com"],
    "EDITOR": ["DeveloperGroup", "DevOpsTeam"],
    "VIEWER": ["ReadOnlyGroup", "bob@example.com"]
  }
}
```

**참고**  
역할 이름은 대소문자를 구분하며 대문자(ADMIN, EDITOR, VIEWER)여야 합니다.

**중요**  
AWS Identity Center와의 EKS 기능 통합은 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>

관리자 계정은 클러스터 등록 및 리포지토리 구성과 같은 초기 설정 및 관리 태스크를 위해 설계되었습니다.

 **관리자 계정이 적절한 경우**:
+ 초기 기능 설정 및 구성
+ 단독 개발 또는 빠른 데모
+ 관리 태스크(클러스터 등록, 리포지토리 구성, 프로젝트 생성)

 **관리자 계정의 모범 사례**:
+ 버전 관리에 계정 토큰을 커밋하지 않음
+ 공개된 경우 즉시 토큰 교체
+ 계정 토큰 사용을 설정 및 관리 태스크로 제한
+ 짧은 만료 시간 설정(최대 12시간)
+ 지정된 시점에서 한 번에 5개의 계정 토큰만 생성할 수 있음

 **대신 프로젝트 기반 액세스를 사용해야 하는 경우**:
+ 여러 사용자와 공유된 개발 환경
+ 프로덕션과 유사한 모든 환경
+ 작업을 수행한 사람에 대한 감사 추적이 필요한 경우
+ 리소스 제한 사항 또는 액세스 경계를 적용해야 하는 경우

프로덕션 환경 및 다중 사용자 시나리오의 경우 AWS Identity Center 그룹에 매핑된 전용 RBAC 역할과 함께 프로젝트 기반 액세스 제어를 사용합니다.

## 프로젝트 기반 액세스 제어
<a name="_project_based_access_control"></a>

Argo CD 프로젝트(AppProject)를 사용하여 팀에 세분화된 액세스 제어 및 리소스 격리를 제공합니다.

**중요**  
사용자 또는 그룹을 프로젝트별 역할에 할당하기 전에 먼저 기능 구성의 글로벌 Argo CD 역할(ADMIN, EDITOR 또는 VIEWER)에 매핑해야 합니다. 사용자는 프로젝트 역할에 할당된 경우에도 글로벌 역할 매핑 없이는 Argo CD에 액세스할 수 없습니다.  
사용자를 VIEWER 역할에 글로벌로 매핑한 다음 프로젝트별 역할을 통해 추가 권한을 부여하는 방법을 고려합니다. 그러면 프로젝트 수준에서 세분화된 제어를 허용하면서 기준 액세스를 제공합니다.

프로젝트에서는 다음을 제공합니다.
+  **소스 제한 사항**: 사용할 수 있는 Git 리포지토리 제한
+  **대상 제한 사항**: 대상으로 지정할 수 있는 클러스터 및 네임스페이스 제한
+  **리소스 제한 사항**: 배포할 수 있는 Kubernetes 리소스 유형 제한
+  **RBAC 통합**: 프로젝트를 AWS Identity Center 그룹 또는 Argo CD 역할에 매핑

 **팀 격리를 위한 프로젝트 예제**:

```
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 기능을 사용하는 경우 `spec.sourceNamespaces` 필드가 AppProject 정의에 필요합니다. 이 필드는 이 프로젝트를 참조하는 Applications 또는 ApplicationSets를 포함할 수 있는 네임스페이스를 지정합니다.

**중요**  
EKS Argo CD 기능은 기능(일반적으로 `argocd`)을 생성할 때 사용자가 지정한 네임스페이스인 Applications 및 ApplicationSets에 대한 단일 네임스페이스만 지원합니다. 여러 네임스페이스를 지원하는 오픈 소스 Argo CD와는 다릅니다.

 **AppProject 구성** 

모든 AppProjects는 `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`에서 기능의 네임스페이스를 생략하면 해당 네임스페이스의 Applications 또는 ApplicationSets가 이 프로젝트를 참조할 수 없으므로 배포에 실패합니다.

 **프로젝트에 사용자 지정**:

프로젝트 역할은 EDITOR 및 VIEWER 사용자에게 프로젝트 리소스(Applications, ApplicationSets, 리포지토리 및 클러스터 자격 증명) 및 기능(로그, 실행)에 대한 액세스 권한을 부여합니다. 프로젝트 역할이 없으면 글로벌 역할 액세스 권한이 있더라도 이러한 사용자는 이러한 리소스에 액세스할 수 없습니다.

ADMIN 사용자는 프로젝트 역할 없이도 모든 애플리케이션에 액세스할 수 있습니다.

 **예제: 팀원에게 애플리케이션 액세스 권한 부여** 

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

**참고**  
사용자가 UI에서 클러스터 이름을 볼 수 있도록 프로젝트 역할에 `clusters, get, *, allow`를 포함합니다. 이 권한이 없으면 대상 클러스터가 '알 수 없음'으로 표시됩니다.

 **프로젝트 역할 정책 이해**:

정책 형식은 다음과 같습니다. `p, proj:<project>:<role>, <resource>, <action>, <object>, <allow/deny>` 

 **리소스 정책**:
+  `applications, , team-a/, allow` - 프로젝트의 모든 애플리케이션에 대한 전체 액세스
+  `applications, get, team-a/*, allow` - 애플리케이션에 대한 읽기 전용 액세스
+  `applications, sync, team-a/*, allow` - 애플리케이션을 동기화할 수 있지만 생성/삭제할 수 없음
+  `applications, delete, team-a/*, allow` - 애플리케이션을 삭제할 수 있음(주의하여 사용)
+  `applicationsets, , team-a/, allow` - ApplicationSets에 대한 전체 액세스
+  `repositories, *, *, allow` - 리포지토리 자격 증명에 대한 액세스
+  `clusters, *, *, allow` - 클러스터 자격 증명에 대한 액세스

 **기능 정책**:
+  `logs, , team-a/, allow` - 애플리케이션 로그에 대한 액세스
+  `exec, , team-a/, allow` - 애플리케이션 포드에 대한 실행 액세스

**참고**  
EDITOR 사용자는 이들이 업데이트할 수 있는 프로젝트 내에서 자신과 다른 사용자에게 권한을 부여하기 위해 프로젝트 역할을 생성할 수 있습니다. 이를 통해 팀 리드가 ADMIN의 개입 없이도 팀의 프로젝트 범위 리소스에 대한 액세스를 제어할 수 있습니다.

**참고**  
`groups` 필드에 Identity Center 그룹 ID(그룹 이름 아님)를 사용합니다. 개별 사용자 액세스를 위해 Identity Center 사용자 ID를 사용할 수도 있습니다. AWS Identity Center 콘솔 또는 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)는 개발자에게 프로젝트 리소스(Applications, ApplicationSets, 자격 증명) 및 기능(로그, 실행)에 대한 액세스 권한을 부여하도록 프로젝트 역할을 구성함

1. 개발자(VIEWER)는 프로젝트 역할에서 허용하는 리소스 및 기능에만 액세스할 수 있음

 **패턴 3: 프로젝트 역할을 사용하는 팀 기반 액세스** 

1. ADMIN은 프로젝트를 생성하고 팀 리드를 EDITOR 역할에 글로벌로 매핑함

1. 팀 리드(EDITOR)는 프로젝트 내 프로젝트 역할에 팀원을 할당함

1. 팀원에게는 VIEWER 글로벌 역할만 있으면 되며, 프로젝트 역할은 프로젝트 리소스 및 기능에 대한 액세스를 제공함

```
{
  "rbacRoleMapping": {		 	 	 
    "ADMIN": ["PlatformTeam"],
    "EDITOR": ["TeamLeads"],
    "VIEWER": ["AllDevelopers"]
  }
}
```

## 모범 사례
<a name="_best_practices"></a>

 **개별 사용자 대신 그룹 사용**: 더 쉽게 관리하도록 AWS Identity Center 그룹을 개별 사용자가 아닌 Argo CD 역할에 매핑합니다.

 **최소 권한으로 시작**: VIEWER 액세스 권한으로 시작하고 필요에 따라 EDITOR 또는 ADMIN을 부여합니다.

 **팀 격리를 위해 프로젝트 사용**: 서로 다른 팀 또는 환경에 대해 별도의 AppProject를 생성하여 경계를 적용합니다.

 **Identity Center 페더레이션 활용**: 중앙 집중식 사용자 관리를 위해 기업 ID 제공업체와 페더레이션하도록 AWS Identity Center를 구성합니다.

 **정기적인 액세스 검토**: 역할 매핑 및 프로젝트 할당을 정기적으로 검토하여 적절한 액세스 수준을 보장합니다.

 **클러스터 액세스 제한**: Argo CD RBAC는 Argo CD 리소스 및 작업에 대한 액세스를 제어하지만 Kubernetes RBAC에는 해당되지 않습니다. Argo CD 액세스 권한이 있는 사용자는 Argo CD에서 액세스할 수 있는 클러스터에 애플리케이션을 배포할 수 있습니다. Argo CD에서 액세스할 수 있는 클러스터를 제한하고 프로젝트 대상 제한 사항을 사용하여 애플리케이션을 배포할 수 있는 위치를 제어합니다.

## AWS 서비스 권한
<a name="shared_aws_service_permissions"></a>

리포지토리 리소스를 생성하지 않고 애플리케이션 리소스에서 직접 AWS 서비스를 사용하려면 필요한 IAM 권한을 기능 역할에 연결합니다.

 **헬름 차트에 대한 ECR**:

```
{
  "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) - 프로젝트를 포함한 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로 작업하기 전에 다음이 필요합니다.
+ Argo CD 기능이 생성된 EKS 클러스터([Argo CD 기능 생성](create-argocd-capability.md) 참조)
+ Kubernetes 매니페스트를 포함하는 Git 리포지토리
+  클러스터와 통신하도록 구성된 `kubectl`

## 일반적인 작업
<a name="_common_tasks"></a>

다음 주제에서는 일반적인 Argo CD 태스크를 안내합니다.

 **[리포지토리 액세스 구성](argocd-configure-repositories.md)** - AWS Secrets Manager, AWS CodeConnections 또는 Kubernetes 보안 암호를 사용하여 Git 리포지토리에 액세스하도록 Argo CD를 구성합니다.

 **[대상 클러스터 등록](argocd-register-clusters.md)** - Argo CD가 애플리케이션을 배포할 대상 클러스터를 등록합니다.

 **[Argo CD 프로젝트 작업](argocd-projects.md)** - 다중 테넌트 환경에 대한 프로젝트를 사용하여 애플리케이션을 구성하고 보안 경계를 적용합니다.

 **[애플리케이션 생성](argocd-create-application.md)** - 자동 또는 수동 동기화 정책을 통해 Git 리포지토리에서 배포하는 애플리케이션을 생성합니다.

 **[ApplicationSet 사용](argocd-applicationsets.md)** - ApplicationSet를 사용하여 템플릿 및 생성기를 통해 여러 환경 또는 클러스터에 애플리케이션을 배포합니다.

## 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 설명서](https://argo-cd.readthedocs.io/) - 전체 사용 설명서
+  [Application Spec](https://argo-cd.readthedocs.io/en/stable/user-guide/application-specification/) - 전체 애플리케이션 API 참조
+  [ApplicationSet Guide](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 리포지토리 및 헬름 차트 레지스트리에 액세스하도록 Argo CD를 구성합니다. Argo CD는 GitHub, GitLab, Bitbucket, AWS CodeCommit 및 AWS ECR에 대해 여러 인증 방법을 지원합니다.

**참고**  
직접 AWS 서비스 통합(ECR 헬름 차트, CodeCommit 리포지토리 및 CodeConnections)의 경우 리포지토리 구성을 생성하지 않고도 애플리케이션 리소스에서 직접 참조할 수 있습니다. 용량 역할에는 필요한 IAM 권한이 있어야 합니다. 세부 정보는 [Argo CD 권한 구성](argocd-permissions.md) 섹션을 참조하세요.

## 사전 조건
<a name="_prerequisites"></a>
+ Argo CD 기능이 생성된 EKS 클러스터
+ Kubernetes 매니페스트를 포함하는 Git 리포지토리
+  클러스터와 통신하도록 구성된 `kubectl`

**참고**  
 AWS CodeConnections는 AWS 클라우드 또는 온프레미스에 있는 Git 서버에 연결할 수 있습니다. 자세한 내용은 [AWS CodeConnections](https://docs.aws.amazon.com/codeconnections/latest/userguide/welcome.html)를 참조하세요.

## 인증 방법
<a name="_authentication_methods"></a>


| 방법 | 사용 사례 | 필요한 IAM 권한 | 
| --- | --- | --- | 
|   **AWS 서비스와 직접 통합**   | 
|  CodeCommit  |  AWS CodeCommit Git 리포지토리와 직접 통합. 리포지토리 구성이 필요하지 않습니다.  |   `codecommit:GitPull`   | 
|  CodeConnections  |  관리형 인증을 사용하여 GitHub, GitLab 또는 Bitbucket에 연결합니다. 연결 설정이 필요합니다.  |   `codeconnections:UseConnection`   | 
|  ECR OCI 아티팩트  |  OCI 헬름 차트 및 매니페스트 이미지에 대한 AWS ECR과 직접 통합. 리포지토리 구성이 필요하지 않습니다.  |   `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 서비스의 경우 리포지토리 구성을 생성하지 않고도 애플리케이션 리소스에서 직접 참조할 수 있습니다. 용량 역할에는 필요한 IAM 권한이 있어야 합니다.

### CodeCommit 리포지토리
<a name="_codecommit_repositories"></a>

애플리케이션에서 직접 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 헬름 차트
<a name="_ecr_helm_charts"></a>

ECR은 헬름 차트를 OCI 아티팩트로 저장합니다. Argo CD는 이를 참조하는 다음과 같은 두 가지 방법을 지원합니다.

 **헬름 형식**(헬름 차트의 경우 권장):

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

참고: 헬름 형식을 사용할 때는 `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:GetAuthorizationToken`, `ecr:BatchGetImage`, `ecr:GetDownloadUrlForLayer`와 같은 필수 ECR 권한이 포함되어 있습니다.

## 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`에서 리포지토리 자격 증명 템플릿을 사용합니다. 그러면 개별 리포지토리 보안 암호를 생성할 때보다 사용자 경험이 개선됩니다. 자세한 내용은 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`에서 리포지토리 자격 증명 템플릿을 사용합니다. 그러면 각 리포지토리에 대해 개별 리포지토리 보안 암호를 생성할 때보다 사용자 경험이 개선됩니다.

 **리포지토리 자격 증명 템플릿 생성**:

```
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`와 일치하는 모든 리포지토리에 적용됩니다. 그런 다음 추가 보안 암호를 생성하지 않고 애플리케이션에서 이 조직의 모든 리포지토리를 참조할 수 있습니다.

자세한 내용은 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) - 배포에 대한 대상 클러스터 등록
+  [애플리케이션 생성](argocd-create-application.md) - 첫 번째 애플리케이션 생성
+  [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 애플리케이션을 생성하려면 [애플리케이션 생성](argocd-create-application.md) 섹션을 참조하세요.

## 사전 조건
<a name="_prerequisites"></a>
+ Argo CD 기능이 생성된 EKS 클러스터
+  클러스터와 통신하도록 구성된 `kubectl`
+ 원격 클러스터의 경우: 적절한 IAM 권한 및 액세스 항목

## 로컬 클러스터 등록
<a name="_register_the_local_cluster"></a>

Argo CD가 실행 중인 동일한 클러스터에 애플리케이션을 배포하려면 배포 대상으로 등록합니다.

**중요**  
Argo CD 기능은 로컬 클러스터를 자동으로 등록하지 않습니다. 애플리케이션을 동일한 클러스터에 배포하려면 명시적으로 등록해야 합니다. 온라인에서 대부분의 Argo CD 예제와의 호환성을 위해 클러스터 이름 `in-cluster`를 사용할 수 있습니다.

**참고**  
Argo CD 기능 역할을 통해 로컬 클러스터에 대해 EKS 액세스 항목이 자동으로 생성되지만, 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`는 전체 cluster-admin 액세스 권한(`system:masters`와 동등함)을 제공합니다. 이는 시작하기에 편리하지만 프로덕션에서 사용해서는 안 됩니다. 프로덕션 환경의 경우 액세스 항목을 사용자 지정 Kubernetes 그룹에 연결하고 적절한 Role 또는 ClusterRole 바인딩을 생성하여 보다 제한적인 권한을 사용합니다. 최소 권한 구성은 아래 프로덕션 설정 섹션을 참조하세요.

 **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 애플리케이션을 로컬로 배포하는 경우 클러스터 범위의 읽기 액세스와 특정 네임스페이스에 대한 쓰기 액세스가 필요함 \$1 CRD를 생성해야 하는 경우 추가 cluster-admin 권한이 필요함

요구 사항에 따라 Argo CD에 필요한 권한을 명시적으로 구성해야 합니다.

### Argo CD에 대한 최소 권한
<a name="_minimum_permissions_for_argo_cd"></a>

오류 없이 작동하려면 Argo CD에 두 가지 유형의 권한이 필요합니다.

 **읽기 권한(클러스터 범위):** Argo CD는 다음과 같은 경우에 클러스터 전체에서 모든 리소스 유형 및 사용자 지정 리소스 정의(CRD)를 읽을 수 있어야 합니다.
+ 리소스 검색 및 상태 확인
+ 원하는 상태와 실제 상태 간 드리프트 감지
+ 배포 전 리소스 검증

 **쓰기 권한(네임스페이스별)**: Argo CD에는 애플리케이션에 정의된 리소스에 대한 생성, 업데이트 및 삭제 권한이 필요합니다.
+ 애플리케이션 워크로드(배포, 서비스, ConfigMaps 등) 배포
+ 사용자 지정 리소스(애플리케이션별 CRD) 적용
+ 애플리케이션 수명 주기 관리

### 빠른 설정
<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`는 CRD를 생성하고, 클러스터 범위의 리소스를 수정하며, 모든 네임스페이스에 배포하는 기능을 포함하여 전체 cluster-admin 액세스(`system:masters`와 동등함)를 제공합니다. 이는 개발 및 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단계: 읽기 액세스를 위해 ClusterRole 생성** 

```
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가 애플리케이션을 배포해야 하는 각 네임스페이스에 대해 RoleBinding을 반복합니다.

**중요**  
Argo CD는 특정 네임스페이스에만 배포되더라도 상태 확인 및 검색을 위해 클러스터 전체에서 모든 리소스 유형을 읽을 수 있어야 합니다. 클러스터 범위의 읽기 액세스 권한이 없으면 애플리케이션 상태를 확인할 때 Argo CD에 오류가 표시됩니다.

## 프로젝트로 클러스터 액세스 제한
<a name="_restrict_cluster_access_with_projects"></a>

Projects를 사용하여 `spec.destinations`에서 허용되는 대상 클러스터 및 네임스페이스를 구성함으로써 Applications가 배포할 수 있는 클러스터 및 네임스페이스를 제어합니다.

```
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 프로젝트 작업](argocd-projects.md)을 참조하세요.

## 추가 리소스
<a name="_additional_resources"></a>
+  [Argo CD 프로젝트 작업](argocd-projects.md) - 애플리케이션 구성 및 보안 경계 적용
+  [애플리케이션 생성](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 프로젝트 작업
<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 설명서의 [The Default Project](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'

  # 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 설명서의 [Managing Projects](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#managing-projects)를 참조하세요.

### 대상 제한 사항
<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 설명서의 [Managing Projects](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 Identity Center 사용자 및 그룹에 프로젝트 역할을 매핑하여 애플리케이션을 동기화, 업데이트 또는 삭제할 수 있는 사용자를 제어합니다.

 **예제: 개발자 및 관리자 역할이 있는 프로젝트** 

```
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 설명서의 [Project Roles](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 및 Identity Center 통합 구성
+  [애플리케이션 생성](argocd-create-application.md) - 프로젝트 내에서 애플리케이션 생성
+  [ApplicationSet 사용](argocd-applicationsets.md) - 다중 클러스터 배포를 위해 프로젝트와 함께 ApplicationSet 사용
+  [Argo CD 프로젝트 설명서](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/) - 전체 업스트림 참조

# 애플리케이션 생성
<a name="argocd-create-application"></a>

애플리케이션은 대상 클러스터의 배포를 나타냅니다. 각 애플리케이션은 소스(Git 리포지토리)와 대상(클러스터 및 네임스페이스)을 정의합니다. 적용되면 Argo CD는 Git 리포지토리의 매니페스트가 클러스터의 네임스페이스에 대해 지정한 리소스를 생성합니다. 애플리케이션은 종종 워크로드 배포를 지정하지만 대상 클러스터에서 사용 가능한 모든 Kubernetes 리소스를 관리할 수 있습니다.

## 사전 조건
<a name="_prerequisites"></a>
+ Argo CD 기능이 생성된 EKS 클러스터
+ 구성된 리포지토리 액세스([리포지토리 액세스 구성](argocd-configure-repositories.md) 참조)
+ 등록된 대상 클러스터([대상 클러스터 등록](argocd-register-clusters.md) 참조)
+  클러스터와 통신하도록 구성된 `kubectl`

## 기본 애플리케이션 생성
<a name="_create_a_basic_application"></a>

Git 리포지토리에서 배포하는 애플리케이션을 정의합니다.

```
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에서도 작동하지만 가독성을 높이려면 클러스터 이름을 사용하는 것이 좋습니다.

애플리케이션을 적용합니다.

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

 **헬름 차트**:

```
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 리포지토리의 값을 사용하는 헬름 차트**(다중 소스 패턴):

```
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의 헬름 차트**:

```
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 설명서의 [Sync Waves](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/) 및 [Resource Hooks](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 설명서의 [Diffing Customization](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
```

## 애플리케이션 모니터링 및 관리
<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) 섹션을 참조하세요.

 **애플리케이션 롤백**:

Argo CD UI 또는 Argo CD CLI를 사용하거나 애플리케이션 사양에서 `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 프로젝트 작업](argocd-projects.md) - 다중 테넌트 환경에 대한 프로젝트를 사용하여 애플리케이션 구성
+  [ApplicationSet 사용](argocd-applicationsets.md) - 템플릿을 사용하여 여러 클러스터에 배포
+  [애플리케이션 사양](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는 템플릿에서 여러 애플리케이션을 생성하므로 단일 리소스 정의를 사용하여 여러 클러스터, 환경 또는 네임스페이스에서 동일한 애플리케이션을 배포할 수 있습니다.

## 사전 조건
<a name="_prerequisites"></a>
+ Argo CD 기능이 생성된 EKS 클러스터
+ 구성된 리포지토리 액세스([리포지토리 액세스 구성](argocd-configure-repositories.md) 참조)
+  클러스터와 통신하도록 구성된 `kubectl`

**참고**  
ApplicationSets에는 여러 대상 클러스터가 필요하지 않습니다. 클러스터 생성기(예: 목록, git 또는 매트릭스 생성기) 이외의 생성기를 사용하여 원격 클러스터 없이 애플리케이션을 배포할 수 있습니다.

## ApplicationSet 작동 방식
<a name="_how_applicationsets_work"></a>

ApplicationSet는 생성기를 사용하여 파라미터를 생성한 다음 해당 파라미터를 애플리케이션 템플릿에 적용합니다. 생성된 각 파라미터 세트는 하나의 애플리케이션을 생성합니다.

EKS 배포를 위한 일반 생성기:
+  **목록 생성기** - 각 환경에 대한 클러스터 및 파라미터 명시적으로 정의
+  **클러스터 생성기** - 등록된 모든 클러스터에 자동으로 배포
+  **Git 생성기** - 리포지토리 구조에서 애플리케이션 생성
+  **매트릭스 생성기** - 다차원 배포를 위해 생성기 결합
+  **생성기 병합** - 여러 생성기의 파라미터 병합

전체 생성기 참조는 [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개의 애플리케이션이 생성됩니다.

## 클러스터 생성기
<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
```

그러면 등록된 각 클러스터에 대한 애플리케이션이 자동으로 생성됩니다.

 **클러스터 필터링**:

`matchLabels`를 사용하여 특정 클러스터를 포함하거나 `matchExpressions`를 사용하여 클러스터를 제외합니다.

```
spec:
  generators:
  - clusters:
      selector:
        matchLabels:
          environment: production
        matchExpressions:
        - key: skip-appset
          operator: DoesNotExist
```

## Git 생성기
<a name="_git_generators"></a>

Git 생성기는 리포지토리 구조에 기반해 애플리케이션을 생성합니다.
+  **디렉터리 생성기** - 각 디렉터리를 별도의 애플리케이션으로 배포(마이크로서비스에 유용)
+  **파일 생성기** - 파라미터 파일에서 애플리케이션 생성(다중 테넌트 배포에 유용)

 **예제: 마이크로서비스 배포** 

```
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 Generator](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 설명서의 [Matrix Generator](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 및 생성된 애플리케이션 보기**:

```
kubectl get applicationsets -n argocd
kubectl get applications -n argocd -l argocd.argoproj.io/application-set-name=<applicationset-name>
```

 **ApplicationSet 업데이트**

ApplicationSet 사양을 수정하고 다시 적용합니다. Argo CD는 생성된 모든 애플리케이션을 자동으로 업데이트합니다.

```
kubectl apply -f applicationset.yaml
```

 **ApplicationSet 삭제**:

```
kubectl delete applicationset <name> -n argocd
```

**주의**  
ApplicationSet를 삭제하면 생성된 모든 애플리케이션이 삭제됩니다. 해당 애플리케이션에 `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의 ApplicationSets 기능에는 ApplicationSets를 사용하기 전에 알아야 하는 보안 고려 사항이 있습니다. 자세한 내용은 Argo CD 설명서의 [ApplicationSet Security](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Security/)를 참조하세요.

## 추가 리소스
<a name="_additional_resources"></a>
+  [Argo CD 프로젝트 작업](argocd-projects.md) - 프로젝트로 ApplicationSets 구성
+  [애플리케이션 생성](argocd-create-application.md) - 애플리케이션 구성 이해
+  [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>

이 주제에서는 계획, 권한, 인증 및 다중 클러스터 배포 패턴을 포함하여 Argo CD에 대한 EKS 기능 사용 시 중요한 고려 사항을 다룹니다.

## 계획
<a name="_planning"></a>

Argo CD를 배포하기 전에 다음을 고려하세요.

 **리포지토리 전략**: 애플리케이션 매니페스트가 저장될 위치(CodeCommit, GitHub, GitLab, Bitbucket)를 결정합니다. 여러 환경에 대한 리포지토리 구조 및 분기 전략을 계획합니다.

 **RBAC 전략**: 관리자, 편집기 또는 최종 사용자 액세스 권한을 보유해야 하는 팀 또는 사용자를 계획합니다. AWS Identity Center 그룹 또는 Argo CD 역할에 매핑합니다.

 **다중 클러스터 아키텍처**: 단일 Argo CD 인스턴스에서 여러 클러스터를 관리할지 결정합니다. Argo CD에 대해 전용 관리 클러스터를 사용하는 방법을 고려합니다.

 **Application 구성**: Application 및 ApplicationSet를 구조화하는 방법을 계획합니다. 프로젝트를 사용하여 팀 또는 환경별로 애플리케이션을 구성하는 방법을 고려합니다.

 **동기화 정책**: 애플리케이션이 자동으로 동기화되어야 하는지 아니면 수동 승인이 필요한지 결정합니다. 자동화된 동기화는 개발에서 일반적이고, 프로덕션의 경우 수동으로 진행됩니다.

## 권한
<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는 AWS 리소스를 직접 관리하지 않고 주로 Kubernetes 리소스를 관리합니다. 그러나 IAM 기능 역할은 다음 경우에 필요합니다.
+ CodeCommit에서 프라이빗 Git 리포지토리에 액세스
+ 인증을 위해 AWS Identity Center와 통합
+ 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>

퍼블릭 Git 리포지토리가 있는 기본 Argo CD 기능의 경우 신뢰 정책 외에 추가 IAM 정책은 필요하지 않습니다.

## Authentication
<a name="_authentication"></a>

### AWS Identity Center 통합
<a name="shared_aws_identity_center_integration"></a>

Argo CD 관리형 기능은 AWS Identity Center(이전의 AWS SSO)에 직접 통합되어 기존 ID 제공업체를 인증에 사용할 수 있습니다.

AWS Identity Center 통합을 구성하는 경우:

1. 사용자는 EKS 콘솔을 통해 Argo CD UI에 액세스함

1. 사용자는 AWS Identity Center(기업 ID 제공업체에 페더레이션할 수 있음)를 사용하여 인증함

1.  AWS Identity Center는 Argo CD에 사용자 및 그룹 정보를 제공함

1. Argo CD는 사용자 구성을 기반으로 사용자 및 그룹을 RBAC 역할에 매핑함

1. 사용자는 액세스 권한이 있는 애플리케이션 및 리소스만 볼 수 있음

### Identity Center 권한 세트를 사용하여 액세스 단순화
<a name="_simplifying_access_with_identity_center_permission_sets"></a>

 AWS Identity Center는 Argo CD로 작업할 때 2개의 고유한 인증 경로를 제공합니다.

 **Argo CD API 인증**: Identity Center는 Argo CD UI 및 API에 SSO 인증을 제공합니다. 이는 Argo CD 기능의 RBAC 역할 매핑을 통해 구성됩니다.

 **EKS 클러스터 액세스**: Argo CD 기능은 고객이 제공한 IAM 역할을 사용하여 액세스 항목을 통해 EKS 클러스터로 인증합니다. 이러한 액세스 항목은 권한을 추가하거나 제거하도록 수동으로 구성할 수 있습니다.

[Identity Center 권한 세트](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtocreatepermissionset.html)를 사용하여 단일 자격 증명이 Argo CD 및 EKS 클러스터 모두에 액세스할 수 있도록 허용함으로써 자격 증명 관리를 단순화할 수 있습니다. 이렇게 하면 Argo CD 액세스 및 클러스터 액세스를 위한 별도의 자격 증명을 유지 관리하는 대신, 두 시스템에서 하나의 자격 증명만 관리하면 되므로 오버헤드가 줄어듭니다.

### RBAC 역할 매핑
<a name="_rbac_role_mappings"></a>

Argo CD에는 AWS Identity Center 사용자 및 그룹에 매핑할 수 있는 기본 제공 역할이 있습니다.

 **ADMIN**: 모든 애플리케이션 및 설정에 대한 전체 액세스 권한. 애플리케이션을 생성, 배포, 업데이트 및 삭제할 수 있습니다. Argo CD 구성을 관리할 수 있습니다.

 **EDITOR**: 애플리케이션을 생성하고 수정할 수 있습니다. Argo CD 설정을 변경하거나 애플리케이션을 삭제할 수 없습니다.

 **VIEWER**: 애플리케이션에 대한 읽기 전용 액세스 권한. 애플리케이션 상태 및 기록을 볼 수 있습니다. 변경을 수행할 수 없습니다.

**참고**  
역할 이름은 대소문자를 구분하며 대문자(ADMIN, EDITOR, VIEWER)여야 합니다.

**중요**  
AWS Identity Center와의 EKS 기능 통합은 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>

`argocd` 네임스페이스에서 Kubernetes 보안 암호를 사용하여 클러스터를 등록합니다.

대상 클러스터 ARN을 가져옵니다. *region-code*를 대상 클러스터가 있는 AWS 리전으로 바꾸고 *target-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 리포지토리, 헬름 레지스트리 또는 OCI 이미지)에 모든 애플리케이션 매니페스트를 저장하여 버전 제어, 감사 추적 및 협업을 지원합니다.

 **적절한 RBAC 구현**: AWS Identity Center 통합을 사용하여 Argo CD에서 애플리케이션에 액세스하고 관리할 수 있는 사용자를 제어합니다. Argo CD는 애플리케이션 내 리소스(배포, 포드, ConfigMaps, 보안 암호)에 대한 세분화된 액세스 제어를 지원합니다.

 **다중 환경 배포에 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` 패턴을 따르며, 여기서 `serverUrl`은 Argo CD 서버 URL입니다.

예를 들어 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`으로 설정하고 '푸시 이벤트만'을 선택합니다.

 **GitLab**: 프로젝트 설정에서 Argo CD 웹후크 URL을 통해 웹후크를 추가합니다. '푸시 이벤트' 및 선택적으로 '푸시 이벤트 태그'를 활성화합니다.

 **Bitbucket**: 리포지토리 설정에서 Argo CD 웹후크 URL을 통해 웹후크를 추가합니다. 트리거로 '리포지토리 푸시'를 선택합니다.

 **CodeCommit**: CodeCommit 리포지토리 상태 변경을 트리거하고 Argo CD 웹후크 엔드포인트로 알림을 보내는 Amazon EventBridge 규칙을 생성합니다.

자세한 웹후크 구성 지침은 [Argo CD Webhook Configuration](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 애플리케이션을 생성하고 관리하는 방법 알아보기
+  [Argo CD 기능 관련 문제 해결](argocd-troubleshooting.md) - Argo CD 문제 해결
+  [기능 리소스 작업](working-with-capabilities.md) - Argo CD 기능 리소스 관리

# Argo CD 기능 관련 문제 해결
<a name="argocd-troubleshooting"></a>

이 주제에서는 기능 상태 확인, 애플리케이션 동기화 문제, 리포지토리 인증 및 다중 클러스터 배포를 포함하여 Argo CD의 EKS 기능에 대한 문제 해결 지침을 제공합니다.

**참고**  
EKS 기능은 완전관리형 기능이며, 클러스터 외부에서 실행됩니다. 사용자는 Argo CD 서버 로그 또는 `argocd` 네임스페이스에 액세스할 수 없습니다. 문제 해결은 기능 상태, 애플리케이션 상태 및 구성에 중점을 둡니다.

## 기능이 ACTIVE 상태이지만 애플리케이션이 동기화되지 않음
<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 자격 증명이 유효하지 않음
+  **애플리케이션이 생성되지 않음**: 클러스터에 애플리케이션 리소스가 없음
+  **동기화 정책**: 수동 동기화가 필요함(자동 동기화가 활성화되지 않음)
+  **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 애플리케이션 생성 및 관리
+  [대상 클러스터 등록](argocd-register-clusters.md) - 다중 클러스터 배포 구성
+  [EKS 기능 문제 해결](capabilities-troubleshooting.md) - 일반 기능 문제 해결 지침

# Argo CD의 EKS 기능과 자체 관리형 Argo CD 비교
<a name="argocd-comparison"></a>

Argo CD의 EKS 기능은 EKS에서 실행되는 완전관리형 Argo CD 환경을 제공합니다. EKS 기능과 자체 관리형 솔루션의 일반적인 비교는 [EKS 기능 및 고려 사항](capabilities-considerations.md) 섹션을 참조하세요. 이 주제에서는 인증, 다중 클러스터 관리, 업스트림 기능 지원을 비롯한 Argo CD 특정 차이에 중점을 둡니다.

## 업스트림 Argo CD와의 차이
<a name="_differences_from_upstream_argo_cd"></a>

Argo CD의 EKS 기능은 업스트림 Argo CD를 기반으로 하지만 액세스, 구성 및 AWS 서비스와 통합하는 방식에서 차이가 납니다.

 **RBAC 및 인증**: 이 기능은 세 가지 RBAC 역할(관리자, 편집자, 뷰어)과 함께 제공되며 Argo CD의 기본 제공 인증 대신 인증에 AWS Identity Center를 사용합니다. 기능의 `rbacRoleMapping` 파라미터를 통해 역할 매핑을 구성하여 Identity Center 그룹을 Argo CD의 `argocd-rbac-cm` ConfigMap이 아닌 Argo CD 역할에 매핑합니다. Argo CD UI는 자체 직접 URL(EKS 콘솔에서 클러스터의 기능 탭 아래 찾기)로 호스팅되며, API 액세스는 IAM을 통해 AWS 인증 및 권한 부여를 사용합니다.

 **클러스터 구성**: 이 기능은 로컬 클러스터 또는 허브 및 스포크 토폴로지를 자동으로 구성하지 않습니다. 사용자가 배포 대상 클러스터 및 EKS 액세스 항목을 구성합니다. 이 기능은 EKS 클러스터 ARN(Kubernetes API 서버 URL 아님)을 사용하는 배포 대상으로 Amazon EKS 클러스터만 지원합니다. 기능은 로컬 클러스터(`kubernetes.default.svc`)를 배포 대상으로 자동 추가하지 않습니다. 기능이 생성된 동일한 클러스터에 배포하려면 ARN을 사용하여 해당 클러스터를 명시적으로 등록합니다.

 **단순화된 원격 클러스터 액세스**: 이 기능은 EKS 액세스 항목을 사용하여 Argo CD에 원격 클러스터에 대한 액세스 권한을 부여함으로써 다중 클러스터 배포를 단순화하므로 서비스 계정에 대한 IAM 역할(IRSA)을 구성하거나 교차 계정 IAM 역할 수임을 설정할 필요가 없습니다. 또한 이 기능은 VPC 피어링 또는 특수 네트워킹 구성 없이도 완전한 프라이빗 EKS 클러스터에 대한 투명한 액세스를 제공합니다. AWS는 Argo CD 기능과 프라이빗 원격 클러스터 간 연결을 자동으로 관리합니다.

 **직접 AWS 서비스 통합**: 이 기능은 기능 역할의 IAM 권한을 통해 AWS 서비스와의 직접 통합을 제공합니다. 리포지토리 구성을 생성하지 않고도 애플리케이션 리소스에서 직접 CodeCommit 리포지토리, ECR 헬름 차트 및 CodeConnections를 참조할 수 있습니다. 그러면 인증이 단순화되고 AWS 서비스에 대한 별도의 자격 증명을 관리할 필요가 없습니다. 세부 정보는 [리포지토리 액세스 구성](argocd-configure-repositories.md) 섹션을 참조하세요.

 **네임스페이스 지원**: 이 기능을 사용하려면 Argo CD Application, ApplicationSet 및 AppProject 사용자 지정 리소스를 생성해야 하는 단일 네임스페이스를 지정해야 합니다.

**참고**  
이 네임스페이스 제한 사항은 Argo CD의 자체 사용자 지정 리소스(Application, ApplicationSet, AppProject)에만 적용됩니다. 애플리케이션 워크로드는 대상 클러스터의 모든 네임스페이스에 배포할 수 있습니다. 예를 들어 `argocd` 네임스페이스를 사용하여 기능을 생성하는 경우 모든 애플리케이션 CR은 `argocd` 네임스페이스에서 생성되어야 하지만, 해당 애플리케이션은 `default`, `production`, `staging` 또는 기타 모든 네임스페이스에 워크로드를 배포할 수 있습니다.

**참고**  
관리형 기능에는 CLI 사용 및 AppProject 구성에 대한 특정 요구 사항이 있습니다.  
Argo CD CLI를 사용하는 경우 네임스페이스 접두사를 포함하여 애플리케이션 지정: `argocd app sync namespace/appname` 
AppProject 리소스는 프로젝트가 Applications에 대해 감시할 수 있는 네임스페이스를 정의하기 위해 `.spec.sourceNamespaces`를 지정해야 함(일반적으로 기능을 생성할 때 지정한 네임스페이스로 설정됨)
리소스 추적 주석은 `namespace_appname:group/kind:namespace/name` 형식을 사용합니다.

 **지원되지 않는 기능**: 다음 기능은 관리형 기능에서 사용할 수 없습니다.
+ 사용자 지정 매니페스트 생성을 위한 Config 관리 플러그인(CMP)
+ 리소스 상태 평가를 위한 사용자 지정 Lua 스크립트(표준 리소스에 대한 기본 제공 상태 확인이 지원됨)
+ 알림 컨트롤러
+ 사용자 지정 SSO 공급자(AWS Identity Center를 통한 서드 파티 페더레이션 ID를 포함하여 AWS Identity Center만 지원됨)
+ UI 확장 및 사용자 지정 배너
+ `argocd-cm`, `argocd-params` 및 기타 구성 ConfigMaps에 대한 직접 액세스
+ 동기화 제한 시간 수정(120초로 수정됨)

 **호환성**: Application 및 ApplicationSet는 매니페스트를 변경하지 않고도 업스트림 Argo CD와 동일하게 작동합니다. 이 기능은 동일한 Kubernetes API 및 CRD를 사용하므로 `kubectl` 같은 도구가 동일한 방식으로 작동합니다. 이 기능은 Application 및 ApplicationSet, 자동 동기화가 포함된 GitOps 워크플로, 다중 클러스터 배포, 동기화 정책(자동, 정리, 자체 복구), 동기화 웨이브 및 후크, 표준 Kubernetes 리소스에 대한 상태 평가, 롤백 기능, Git 리포지토리 소스(HTTPS 및 SSH), 헬름, 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"
   ```

**중요**  
이 구성에서는 초기 설정 및 개발 워크플로에 대해 관리자 계정 토큰을 사용합니다. 프로덕션 사용 사례의 경우 프로젝트 범위의 역할과 토큰을 사용하여 최소 권한 원칙을 따릅니다. 프로젝트 역할 및 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. 현재 Argo CD 구성에서 지원되지 않는 기능(알림 컨트롤러, CMP, 사용자 지정 상태 확인, UI 확장) 검토

1. 충돌을 방지하기 위해 자체 관리형 Argo CD 컨트롤러를 0개의 복제본으로 조정

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 Identity Center 통합 구성