PRベースでTerraformを適用！Atlantis × Helm × GKEでCI/CD環境を構築するPart2　HelmチャートをArgoCDで適用しよう！

## はじめに
前回の記事（[PRベースでTerraformを適用！Atlantis × Helm × GKEでCI/CD環境を構築するPart1](https://qiita.com/ILOVERAMEN/items/7bbc7062bb1b63dee15b)）では、手動で ``values.yaml`` を編集し、Helm を利用して Atlantis をデプロイした。本記事では、それを ArgoCD による GitOps で自動デプロイ できるようにする。前回の記事をまだご覧になっていない方は、ぜひご一読ください。

## ArgoCD を導入するメリット
前回の構築では、Helm コマンドを手動で実行する必要があり、``values.yaml`` の管理もローカル環境に依存していた。しかし、ArgoCD を導入することで以下のメリットが得られる。

- GitOps による自動デプロイ：GitHub に ``values.yaml`` を push するだけで、ArgoCD が検知し自動適用

- 一貫性の確保：クラスターの状態を Git で管理し、環境のズレを防ぐ

- 可視性の向上：ArgoCD の UI でアプリケーションのデプロイ状況をリアルタイムに確認可能

- CI/CD の最適化：Atlantis で Terraform の適用を管理し、ArgoCD で Kubernetes のリソースを管理することで、役割を分離

本記事では、これらのメリットを活かし、ArgoCD を利用した Atlantis の GitOps デプロイ手順 を解説する。

## 作業概要
本記事では、**ArgoCD を利用して Atlantis の Helm チャートを GKEクラスター に自動デプロイ** するまでの手順を解説する。作業の大まかな流れは以下のとおり。

1. **前回の記事で作成した LoadBalancer を削除**  

   - 既存の Atlantis の LoadBalancer を削除し、新しいLoadBalancerを以下の手順に沿って ArgoCD で管理するように設定する。

2. **ArgoCD を構築**  

   - GKE クラスターに ArgoCD をデプロイし、GitOps を実現する準備を行う。

3. **Helm チャートを格納する GitHub リポジトリを作成 & ArgoCD との統合**  

   - `atlantis-gitops` リポジトリを作成し、ArgoCD から GitHub を監視できるように設定する。

4. **Helm チャートと ArgoCD Application マニフェストを作成**  

   - RunAtlantis の Helm チャートをクローンし、前回作成した `values.yaml` を適用する。  
   - ArgoCD Application マニフェスト（`atlantis.yaml`）を新規に作成する。

5. **ArgoCD で Application を作成し、GKE クラスター にデプロイ**  

   - ArgoCD に `atlantis.yaml` を適用し、Atlantis の環境を GKEクラスター 上にデプロイ。新しいLoadBalancer も同時に作成される。

6. **GitHub Webhook の接続先を更新**  

   - Atlantis の LoadBalancer の新しい外部 IP を取得し、Terraform リポジトリの Webhook 設定を更新。

7. **`atlantis plan` を実行して動作確認**  

   - Terraform の PR に `atlantis plan` をコメントし、Atlantis 経由で `terraform plan` が実行されることを確認。

この流れに沿って、ArgoCD による自動デプロイを実現する。

## アーキテクチャ

### Terraform適用の全体構成（[前回の記事](https://qiita.com/ILOVERAMEN/items/7bbc7062bb1b63dee15b)で構築済み）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000068/5c1cd7f3-d99b-f23e-77ce-ee4de7ea41dd.png)



 ### ArgoCD統合環境（今回の記事で構築する環境のざっくりした図）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000068/e94ee283-9b5b-3583-877d-4ca15358feb0.png)


 
 1. ユーザーがGitHubにHelmチャートの変更をPush

 2. ArgoCDが変更を検知

 3. GKEクラスター の Namespace : default にリソースをデプロイ

## 構築手順
**⚠️ 本記事の手順は検証環境向けであり、本番環境での運用にはセキュリティ対策や可用性を考慮した設定変更が必要である。**

**1. 前回の記事で作成した既存のLoadBalancerを削除。**

以下のコマンドを実行する。
```
kubectl delete svc atlantis
```
**2. ArgoCDの構築**
参考：[ArgoCD導入ガイド](https://argo-cd.readthedocs.io/en/stable/getting_started/)
```
gcloud container clusters get-credentials <クラスター名> --zone <zone名>

#Namespace：argocdの作成
kubectl create ns argocd

# Namespace：argocdにArgoCDのインストール
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# ArgoCD CLIのダウンロードとインストール
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64

argocd admin initial-password -n argocd #出力されたパスワードを控えておく

# ArgoCDサーバーのサービスをLoadBalancerタイプに変更
kubectl patch svc argocd-server -n argocd -p '{"spec":{"type":"LoadBalancer"}}'
kubectl get svc -n argocd # 出力された外部IPを控えておく
```

**3. Helm チャートを格納する GitHub リポジトリの作成 & ArgoCD との統合**
3.1 GitHub でリポジトリ（atlantis-gitops）を作成
3.2 PAT（Personal Access Token）を作成し（repoのみを選択）、後ほど実施する「ArgoCD に認証情報を設定」するフェーズで利用するので、PAT を控えておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000068/19e5882d-f6ca-f5bb-28b4-119fa9673b18.png)
3.3 ローカル環境にリポジトリをクローン
```
git clone https://github.com/<org名>/atlantis-gitops.git
cd atlantis-gitops
```
3.4 ブラウザで、``https://<Namespace：argocdで取得した外部IP>``を開き、ArgoCD の画面を開く。
ユーザー名：``Admin``
Password：``<コマンドで取得したパスワード>``
を入力し、ログインする。
![スクリーンショット 2025-02-06 182201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000068/d29d945e-8cd8-fa76-dd96-878adac9e16b.png)
3.5 画面左から``Settings``をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000068/78a967cd-3e6f-3c7b-2b38-d9e808a792b8.png)
3.6 ``Repositories``をクリックする。
``+ CONNECT REPO``をクリックし、下記情報を入力して、``CONNECT``をクリックする。
3.7 接続されたことを確認。
```
Type：git
Project：default
Repository URL：https://github.com/<org名>/atlantis-gitops.git
Password：<GitHubで作成したPAT（Personal Access Token）>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000068/ebb97420-28ac-c494-bdb0-3a3757c44b1d.png)


**4. Helm チャートと ArgoCD Application マニフェストを作成**
別で作業ディレクトリを作成し、RunAtlantisのHelmチャートをクローンして、前回の記事で作成した``values.yaml``をコピーしてくる。
```
git clone https://github.com/runatlantis/helm-charts.git
cp <前回作成したvalues.yamlのパス> helm-charts/charts/atlantis/values.yaml
```
作業ディレクトリに ``argocd/atlantis.yaml``を作成し、以下の内容を記述
```sh:argocd/atlantis.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: atlantis    # アプリケーションの名前を変更する場合はここを修正
  namespace: argocd   # Argo CDがインストールされているネームスペース。通常は変更不要
  finalizers:
    - resources-finalizer.argocd.argoproj.io
  labels:
    name: atlantis   # リソースに付けるラベル。
spec:
  project: default  # ArgoCDプロジェクト。

  source:
    repoURL:  https://github.com/<org名>/atlantis-gitops.git  # リポジトリのURL。
    targetRevision: HEAD   # 使用するブランチ。HEADならデフォルトブランチの最新コミットを指す。
    path: charts/atlantis    # Gitリポジトリ内のHelmチャートやKubernetesマニフェストが含まれているディレクトリ。Charts.yamlを直下に含んだディレクトリ。

    helm:
      releaseName: atlantis  # Helmリリースの名前。
      valueFiles:
        - values.yaml    # 使用するvaluesファイル。

  destination:
    server: https://kubernetes.default.svc  # デプロイ先のKubernetes APIサーバー。通常は変更不要
    namespace: atlantis    # デプロイ先のネームスペース。

  syncPolicy:
    automated:
      prune: true  # Gitリポジトリから削除されたリソースをクラスターからも削除。
      selfHeal: true # クラスターのリソースがリポジトリの定義と一致しない場合、自動で修復。
    syncOptions:
      - CreateNamespace=true   # ネームスペースが存在しない場合自動で作成するオプション。

  revisionHistoryLimit: 10   # 保持するリビジョン履歴の最大数。

```
作業ディレクトリの中身を ``atlantis-gitops`` のローカルリポジトリにコピーする。
```
cp -r ./* path/to/atlantis-gitops
```
ローカルリポジトリをリモートリポジトリにPushする。
```
git add .
git commit -m "Add ArgoCD application for Atlantis"
git push origin main
```
**5. ArgoCDでApplicationを作成し、GKEクラスターにデプロイ**
 下記コマンドを実行し、ArgoCDでApplicationを作成する。
```
kubectl apply -f argocd/atlantis.yaml
```
数分後、 ArgoCDの画面上でLoadBalancerやPodが表示されることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000068/63875b51-0a56-cafa-fc0c-c77130d9c4a1.png)

**6. GitHub Webhookの接続先を更新**
下記コマンドを実行し、新規に作成されたLoadBalancerの外部IPを取得。
```
kubectl get svc
```
取得した外部IPアドレスを、TerraformリポジトリのWebhookの接続先URL設定で編集。
![スクリーンショット 2025-02-01 224326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000068/e6c624d3-b6b2-8f6b-3b19-f2666cc520dd.png)
**7. ``atlantis plan``を実行して動作確認**
TerraformリポジトリのPR 内で、``atlantis plan``コメントを追加。
正常にterraform planが実行されたことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000068/ef152dd5-68ba-6d98-c4cc-b4d2770f5f6c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000068/b2e1bc68-8b38-386d-5805-2e84e0a4eb88.png)

## まとめ

本記事では、**ArgoCD を活用した Atlantis の GitOps デプロイ手法** について解説した。

- GitHub に ``values.yaml`` を push するだけで Atlantis が自動デプロイされる仕組みを構築

- ArgoCD の Application を作成し、GKE クラスターに Atlantis のリソースを展開

この仕組みにより、**手動で Helm を実行する必要がなくなり、Terraform 適用のワークフローが自動化**された。
ArgoCD を活用することで、Terraform の適用フローをより安定かつ安全に運用することが可能になる。本記事の手順を参考に、プロジェクトに適した形で GitOps を導入してほしい。