# AWS

## 概要

提供されているk8s設定を使用すれば、Diarkisの使用は簡単です。ただし、これらの設定は初期段階のものであるため、必要に応じて自由に修正してください。

***

### 必要条件

1. **Docker** のいずれかの設定：
   1. **MacOS** - Docker for MacOSをインストール。インストールガイドは[こちら](https://docs.docker.com/desktop/setup/install/mac-install/)。
   2. **Linux** - お使いのLinuxディストリビューションに合わせてDockerをインストール。インストールガイドは[こちら](https://docs.docker.com/desktop/setup/install/linux/)。**注意**: Dockerは`x86_64/amd64`アーキテクチャの主要なLinuxディストリビューション用に`.deb`と`.rpm`パッケージを提供しており、Archベースのディストリビューションの[実験的サポート](https://docs.docker.com/desktop/setup/install/linux/#supported-platforms)も提供しています。
   3. **Windows** (WSL2またはHyper-Vバックエンド) - インストールガイドは[こちら](https://docs.docker.com/desktop/setup/install/windows-install/)。初めてDockerをインストールする場合は、バックエンドの選択前にユースケースを考慮してください。
2. **AWSアカウント** と請求が有効になっていること。AWSアカウントやプロジェクトをお持ちでない場合は、[こちら](https://aws.amazon.com/getting-started/)を参照して始めてください。
3. **AWS CLI** (`aws`コマンド) と適切な認証。インストールガイドは[こちら](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) (**注意**: AWS CLIはすべての主要なオペレーティングシステムをサポートしています)。CLI認証のヘルプは[こちら](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html)を参照してください。
4. **Kubernetes CLI** (`kubectl`コマンド) は[こちら](https://kubernetes.io/docs/tasks/tools/#kubectl)からダウンロード可能です。
5. **EKS CLI** (`eksctl`コマンド) はAWS Workshopの[こちら](https://eksctl.io/installation/)からダウンロード可能です。

***

## セットアップガイド

以下の手順で、テンプレートDiarkisサーバークラスタの構築、デプロイ、オーケストレーションのプロセスをご案内します。これらの手順で、開始するのに十分な情報が得られるはずです。

### Diarkisイメージ用のECRを作成

Diarkisコンポーネントイメージをデプロイ用にプッシュする前に、まずリモートECRレジストリを準備する必要があります。ベースイメージとしてデフォルトで`alpine`を使用しており、[Docker Hub](https://hub.docker.com/_/alpine/)から取得できます。

```bash
aws sts get-caller-identity  # 正しいターゲットを確認
aws ecr create-repository --repository-name http
aws ecr create-repository --repository-name udp
aws ecr create-repository --repository-name tcp
aws ecr create-repository --repository-name mars
```

***

### Diarkis用のEKSを作成して接続

```bash
eksctl create cluster -f cloud/aws/cluster_config.yaml  # 約10分かかります
```

**注意**: 選択したAZでNATゲートウェイの互換性に関するエラーが発生した場合は、別のAZを選択してください

```bash
aws eks --region ap-northeast-1 update-kubeconfig --name diarkis  # k8s認証情報を取得
```

***

### EKSファイアウォールを開放

EKSノードへの`0.0.0.0/0`からのポート`7000-8000`のTCPおよびUDPトラフィックを許可します。\
セキュリティグループ名`eks-cluster-sg-diarkis-*`で設定することをお勧めします。

***

### サーバーイメージにタグを付けてプッシュ

`server-template`で生成されたプロジェクトルートから、以下のコマンドを実行します：

```bash
make build-local
```

`./remote_bin`にサーバー実行ファイル（`udp`、`tcp`、`http`、`mars`）を生成した後、コンテナイメージをビルドします：

```bash
make setup-aws
make build-container-aws
make push-container-aws
```

***

### マニフェストを適用

```bash
kustomize build k8s/aws/overlays/dev0 | kubectl apply -f -
```

以下の4つのコンポーネントが実行中かどうかを確認します：

```bash
$ kubectl get po -n dev0
NAME                    READY   STATUS    RESTARTS   AGE
http-5c7dbbb6d7-lhjlm   1/1     Running   0          3d14h
mars-0                  1/1     Running   0          3d14h
tcp-88dc5f97d-7sqk9     1/1     Running   0          3d14h
udp-fdc6bbccc-dwc5w     1/1     Running   0          3d14h
```

***

### Diarkisクラスタの確認

まず、パブリックエンドポイントを取得します：

```bash
EXTERNAL_IP=$(kubectl get svc http -o json -n dev0 | jq -r '.status.loadBalancer.ingress[].hostname')
kubectl get svc -n dev0 -o wide  # または、このコマンドを使用
```

取得した`EXTERNAL_IP`にHTTP GETリクエストを送信します：

```bash
curl ${EXTERNAL_IP}/auth/1
```

以下のようなレスポンスが返ってきた場合、正常に動作しています：

```json
{
  "TCP": "ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com:7201",
  "UDP": "ec2-yy-yy-yy-yy.ap-northeast-1.compute.amazonaws.com:7101",
  "sid": "xxxxxxxxxx",
  "encryptionKey": "xxxxxxxxxx",
  "encryptionIV": "xxxxxxxxxx",
  "encryptionMacKey": "xxxxxxxxxx"
}
```

項目が不足している場合、デプロイされたコンポーネントのいずれかに問題がある可能性があります。この時点で、Diarkisサポートに連絡することをお勧めします。

***

### クラスタオートスケーラーのセットアップ

```bash
kubectl apply -f cluster-autoscaler-autodiscover.yaml
```

このファイルは`diarkis`というクラスタ名用に事前設定されています。異なるクラスタ名を使用する場合は、マニフェスト内の`diarkis`への参照を修正してください。

***

### ログコレクターのセットアップ

コンテナからのログはCloudWatch Logsを使用して集約できます。\
`fluent-bit`は既に`amazon-cloudwatch`名前空間にデプロイされていますが、権限が設定されていません。

`diarkis-public`と`diarkis-private`ノードに`CloudWatchAgentServerPolicy`を割り当ててログを集約します。ログは`/aws/containerinsights/Cluster_Name/application`の下に表示され、フィルタリングが可能です。
