# 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`の下に表示され、フィルタリングが可能です。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.diarkis.io/diarkis-server/setup-cloud/aws.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
