FastAPIとPostgresのデプロイをAWS初心者向けに解説

## 前提条件
AWSアカウントを持っている
AWS Management Consoleにアクセスできる
## ステップ 1: Amazon EC2インスタンスの作成
AWS Management Consoleにログインし、EC2ダッシュボードに移動します。
「Launch Instance」をクリックして新しいインスタンスを作成します。
**Amazon Machine Image (AMI)**の選択:
Ubuntu Server 20.04 LTSを選択します。
### インスタンスタイプの選択:
t2.micro（無料利用枠対象）を選択します。
### インスタンス設定の構成:
デフォルト設定のままで進めます。
### ストレージの追加:
デフォルトの8GBから16GBに変更します。
### タグの追加（オプション）:
タグは任意ですが、後でインスタンスを管理しやすくするために追加します。
### セキュリティグループの設定:
新しいセキュリティグループを作成し、以下のルールを追加します。
SSH（ポート22）：自分のIPアドレスからのアクセスを許可
HTTP（ポート80）：どこからでもアクセスを許可
HTTPS（ポート443）：どこからでもアクセスを許可
Postgres（ポート5432）：必要に応じてアクセス元を指定
### 確認して起動:
「Review and Launch」をクリックし、設定内容を確認して「Launch」をクリックします。
既存のキーペアを選択するか、新しいキーペアを作成してダウンロードします（このキーペアを使ってインスタンスにSSHでアクセスします）。
ステップ 2: インスタンスへの接続とセットアップ
SSHでインスタンスに接続:

## ダウンロードしたキーペア（.pemファイル）を使ってSSHで接続します。

```bash
ssh -i "your-key.pem" ubuntu@your-ec2-public-dns
```
システムの更新:


```bash
sudo apt update
sudo apt upgrade -y
```
Pythonと必要なパッケージのインストール:


```bash
sudo apt install -y python3 python3-pip
pip3 install fastapi uvicorn psycopg2-binary
```
PostgreSQLのインストールと設定:


```bash
sudo apt install -y postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
```
PostgreSQLの設定:

PostgreSQLにログインし、ユーザーとデータベースを作成します。

```bash
sudo -i -u postgres
psql
CREATE DATABASE mydatabase;
CREATE USER myuser WITH PASSWORD 'mypassword';
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;
\q
exit
```
## ステップ 3: FastAPIアプリケーションの作成
FastAPIアプリケーションのディレクトリを作成:


```bash
mkdir ~/myfastapiapp
cd ~/myfastapiapp
```
FastAPIアプリケーションのコードを作成:

main.pyファイルを作成して以下のコードを追加します。

```python
rom fastapi import FastAPI
import psycopg2

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

@app.get("/db")
def read_db():
    conn = psycopg2.connect(
        dbname="mydatabase",
        user="myuser",
        password="mypassword",
        host="localhost"
    )
    cur = conn.cursor()
    cur.execute("SELECT version();")
    db_version = cur.fetchone()
    cur.close()
    conn.close()
    return {"db_version": db_version}
```
## Uvicornを使ってアプリケーションを起動:


```bash
uvicorn main:app --host 0.0.0.0 --port 8000
```
## ステップ 4: Nginxの設定
Nginxのインストール:


```bash
sudo apt install -y nginx
```
Nginx設定ファイルを編集:


```bash
sudo nano /etc/nginx/sites-available/fastapi
```
以下の設定を追加:


```nginx
server {
    listen 80;
    server_name your-domain-or-ip;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```
設定を有効にしてNginxを再起動:


```bash
sudo ln -s /etc/nginx/sites-available/fastapi /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx
```
ステップ 5: Route 53でドメイン設定
Route 53でホストゾーンを作成:

## AWS Management ConsoleのRoute 53に移動し、「Create Hosted Zone」をクリックしてドメインを設定します。
### Aレコードの追加:

ドメインのAレコードを作成し、EC2インスタンスのパブリックIPアドレスを指定します。
### SSL証明書の設定:

AWS Certificate Manager（ACM）でSSL証明書を作成し、CloudFrontやALBで使用します。
## まとめ
これで、FastAPIアプリケーションとPostgresデータベースがEC2インスタンスで動作し、Reactアプリケーションと通信できるようになります。Route 53を使用してドメインを設定し、SSL証明書を適用することで、セキュアな通信も実現できます。