AWS、Terraform、Gitops関連用語の整理

# AWS
- **アベイラビリティゾーン (AZ)**
    - リージョン内で物理的に分離された1つ以上のデータセンターです。

## VPC
CIDRを指定して作成する隔離された仮想ネットワーク環境です。
- **Public Subnet**
    - 外部からアクセス可能で、Internet Gatewayを通じてインターネットにアクセスできます。
- **Private Subnet**
    - 外部からアクセス不可能で、NAT Gatewayを経由してインターネットにアクセスします。
- **NAT Gateway**
    - Private Subnet内のリソースを外部インターネットと接続するゲートウェイで、逆方向の接続はできません。
- **Public Route Table**
    - Public Subnetから来るトラフィックの経路を設定し、Internet Gatewayを通じて外部に出るように経路を設定します。
    - **Subnet Association**: サブネットとRoute Tableを接続します。
- **Security Group**
    - インスタンスリソースへのアクセスを制御し、ホワイトリスト方式で設定されます。

## AWS 予約済みアドレス
- **10.0.0.0** - ネットワーク自体のアドレス
- **10.0.0.1** - VPCルーターのためのアドレス
- **10.0.0.2** - DNSサーバーのアドレス
- **10.0.0.3** - 将来使用のために予約されたアドレス
- **10.0.0.255** - ネットワークブロードキャストアドレス

# Terraform
リソース間の依存関係を自動的に把握するため、手動で依存関係を定義する必要がありません。
`init - plan - apply`の段階で実行されます。
`tf`、`tfvars`ファイルを一度にまとめて実行し、自動的に依存関係を考慮して実行します。

- **Provider (AWS)**
   - Resource (EC2、VPC、RDSの作成)、Module (ソースの再利用)
   - Output (出力)
   - Variable (入力変数)
   - Terraform (バージョンの定義、バックエンドの設定)

## ファイル形式
- **vars.tf**
    - 必要な変数を定義するファイルで、入力変数の参照は `var.変数名` の形式で使用します。
- **terraform.tfvars**
    - 定義された変数に値を割り当てるファイルで、vars.tfより優先順位が高いです。
- **Output**
    - Terraformの実行結果を出力および外部参照の目的で公開します。
- **Backend**
    - Terraformで管理するインフラの状態情報ファイルの保存場所 (`tfstate`) です。設定されたリモート先がない場合、デフォルトでワークスペース内に保存されます。
- **Module**
    - 共通して再利用するリソースを1つにまとめて定義したオブジェクトです。

## コマンド
- **init**
    - 必要なライブラリ情報を取得します。
- **plan**
    - リソースの結果を検証します。
- **apply**
    - 実際に適用し、`tfstate`ファイルが自動的に生成されます。
- **destroy**
    - リソースを一括削除します。
- **refresh**
    - 最新の状態に更新します。

> `tfstate`がない場合、新しく生成されます。`terraform_lock`は複数人で管理する際に使用し、ロックに関する値をDynamoDBに保存します。

# Git
- **Untracked**
    - 初めて作成されたファイルで、Gitで管理されていない状態です。
- **Unmodified**
    - クローンして持ってきた状態です。
- **Modified**
    - 変更はしたがステージングされていない状態です。
- **Staged**
    - ステージングされている状態です。

## GitOps
- ソースコードだけでなく、デプロイ、設定など全てをコード化します。
- 単一の真実の供給元 (Git)
- 宣言型コードによるCD

## CDタイプ

### プッシュタイプ
- 伝統的な方式で、リポジトリの内容が変更された時にデプロイメントパイプラインを実行します。
- Jenkins、CircleCIなどを使用します。

### プルタイプ
- デプロイ環境のエージェントがデプロイメントパイプラインの代わりに役割を果たします。
- リポジトリとデプロイ環境を継続的に比較および同期します。
- ArgoCD、FluxCDを使用します。（セキュリティのためにプルタイプが推奨されます）

プッシュタイプの場合:
- CI/CDサーバーに`kubectl`ツールをインストールし設定する必要があります。
- CI/CDサーバー内部でKubernetes接続のための設定およびキーを保存する必要があります。
- デプロイ後の状態モニタリングが不可能です。

プルタイプの場合:
- 継続的なモニタリングを通じてインフラの状態を更新します。
- Git以外の外部からクラスターを直接変更することはできません。
- CI/CDサーバー内部にKubernetes接続設定が不要です。
- Kubernetesのみをサポートする場合がほとんどです。

## GitOpsの利点
- 障害復旧時間の短縮
- 信頼できる情報共有が可能
- 人的ミスを防ぎ、安全性が向上し高い信頼性を提供

# Jenkins & ArgoCD
## Jenkins 
- ビルド、テスト、デプロイなどすべてを自動化するサーバーです。
- さまざまなプラグインを活用して自動化作業を処理します。
- パイプラインを通じてCI/CDパイプラインを構築します。

### クレデンシャル
- **グローバルスコープ**: Jenkins内で制約なく使用されます。
    - 例: GitHubトークン、AWSサービスの作成に必要なIAMアクセスキー情報
- **システムスコープ**: メール認証やエージェント接続など、Jenkinsのシステム管理機能のためにのみ使用されます。

### Kubernetesプラグイン 
- **Jenkinsマスター（命令）** - **スレーブ（ビルドジョブの実行）**
    - KubernetesにJenkinsを構築する場合、APIコールを通じてスレーブPodを作成します。
    - スレーブPodでパイプラインを実行し、ジョブ完了後にスレーブPodが削除されます。

### パイプライン
- 連続的なイベントまたはジョブを実行するためのプラグインです。

#### エージェントセクション
- パイプラインをどのノードやエージェントが実行するかを定義します。
- TerraformコンテナがあるPodでパイプラインを実行するよう定義します。

#### ステージセクション
- 処理すべき内容をステージとして定義します。
- **ステップ**: ステージ内で実行される1つ以上の段階です。

### Blue Ocean 
- パイプラインのより簡単な使用のためのUIを提供します。
- 問題が発生した場合、正確に確認できます。

## ArgoCD
- アプリケーションマニフェストファイルが保存されたGitリポジトリを定期的にモニタリングします。
- Gitに定義されたアプリケーションマニフェストの形状とKubernetesにデプロイされたアプリケーションの形状を比較します。

### 構成要素
- **APIサーバー**: Web UI、CLIおよび他のCI/CDシステムからのAPIリクエストを受け取り処理します。
- **アプリケーションコントローラー**: アプリケーションの状態を継続的にモニタリングし、Kubernetesにデプロイされた形状とリポジトリマニフェストに定義された形状を比較して同期作業を行います。

### 機能
- Git/Helm Chartリポジトリを追加できます。
- よく作られたHelm Chartを取得してGitで管理することをお勧めします。