

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 配置存储库访问权限
<a name="argocd-configure-repositories"></a>

在部署应用程序之前，请配置 Argo CD 以访问 Git 存储库和 Helm 图表注册表。Argo CD 支持针对 GitHub、GitLab、Bitbucket、AWS CodeCommit 和 AWS ECR 的多种身份验证方法。

**注意**  
若要与 AWS 服务直接集成（ECR Helm 图表、CodeCommit 存储库和 CodeConnections），您可以直接在 Application 资源中引用它们，而无需创建存储库配置。功能角色必须具有必要的 IAM 权限。有关详细信息，请参阅 [配置 Argo CD 权限](argocd-permissions.md)。

## 先决条件
<a name="_prerequisites"></a>
+ 已创建具有 Argo CD 功能的 EKS 集群
+ Git 存储库包含 Kubernetes 清单
+  已配置 `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 构件  |  直接与 AWS ECR 集成以获取 OCI Helm 图表和清单映像。无需配置存储库。  |   `arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly`   | 
|   **使用凭证配置存储库**   | 
|   AWS Secrets Manager（用户名/令牌）  |  存储个人访问令牌或密码。无需 Kubernetes 访问即可实现凭证轮换。  |   `arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess`   | 
|   AWS Secrets Manager（SSH 密钥）  |  使用 SSH 密钥身份验证。无需 Kubernetes 访问即可实现凭证轮换。  |   `arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess`   | 
|   AWS Secrets Manager（GitHub 应用程序）  |  使用私有密钥对 GitHub 应用程序进行身份验证。无需 Kubernetes 访问即可实现凭证轮换。  |   `arn:aws:iam::aws:policy/AWSSecretsManagerClientReadOnlyAccess`   | 
|  Kubernetes Secret  |  使用集群内密钥的标准 Argo CD 方法  |  无（由 EKS 访问条目使用 Kubernetes RBAC 处理的权限）  | 

## 直接访问 AWS 服务
<a name="direct_access_to_shared_aws_services"></a>

对于 AWS 服务，您可以直接在 Application 资源中引用它们，而无需创建存储库配置。功能角色必须具有必要的 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 Helm 图表
<a name="_ecr_helm_charts"></a>

ECR 将 Helm 图表存储为 OCI 构件。Argo CD 支持两种引用方式：

 **Helm 格式**（建议用于 Helm 图表）：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-helm
  namespace: argocd
spec:
  source:
    repoURL: account-id.dkr.ecr.region.amazonaws.com/repository-name
    targetRevision: chart-version
    chart: chart-name
    helm:
      valueFiles:
        - values.yaml
```

注意：使用 Helm 格式时，请勿包含 `oci://` 前缀。使用 `chart` 字段指定图表名称。

 **OCI 格式**（适用于包含 Kubernetes 清单的 OCI 构件）：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-oci
  namespace: argocd
spec:
  source:
    repoURL: oci://account-id.dkr.ecr.region.amazonaws.com/repository-name
    targetRevision: artifact-version
    path: path-to-manifests
```

注意：使用 OCI 格式时，请包含 `oci://` 前缀。请使用 `path` 字段而非 `chart`。

所需功能角色权限 - 附加托管策略：

```
arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly
```

此策略包括必要的权限：`ecr:GetAuthorizationToken`、`ecr:BatchGetImage` 和 `ecr:GetDownloadUrlForLayer`。

## 使用 AWS Secrets Manager
<a name="using_shared_aws_secrets_manager"></a>

将存储库凭证存储在 Secrets Manager 中，然后在 Argo CD 存储库配置中引用它们。使用 Secrets Manager 可实现自动化的凭证轮换，且无需 Kubernetes RBAC 访问权限 – 可借助针对 Secrets Manager 的 IAM 权限来轮换凭证，而 Argo CD 会自动读取更新后的值。

**注意**  
要在多个存储库（例如，GitHub 组织下的所有存储库）中重复使用凭证，请将存储库凭证模板与 `argocd.argoproj.io/secret-type: repo-creds` 结合使用。这比单独创建每个存储库的密钥能提供更好的用户体验。有关更多信息，请参阅 Argo CD 文档中的[存储库凭证](https://argo-cd.readthedocs.io/en/stable/operator-manual/argocd-repo-creds-yaml/)。

### 用户名和令牌身份验证
<a name="_username_and_token_authentication"></a>

对于使用个人访问令牌或密码的 HTTPS 存储库：

 **在 Secrets Manager 中创建 Secret**：

```
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 的 Repository Secret**：

```
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 私有密钥的 Secret**：

```
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 创建 Repository Secret**：

```
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 应用程序凭证的 Secret**：

```
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 应用程序创建 Repository Secret**：

```
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 文档中的[存储库凭证](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 Secrets
<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 用户界面，在“设置 → 存储库”下检查连接状态。用户界面会显示连接状态和任何身份验证错误。

Repository Secret 不包含状态信息。

## 其他资源
<a name="_additional_resources"></a>
+  [注册目标集群](argocd-register-clusters.md)：注册用于部署的目标集群
+  [创建应用程序](argocd-create-application.md)：创建第一个应用程序
+  [Argo CD 注意事项](argocd-considerations.md)：IAM 权限和安全配置
+  [Private Repositories](https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/)：上游存储库配置参考