AWS FargateでのStreamlitアプリケーションデプロイ：IaL要件定義書プロンプトで簡単実現！

近年、クラウドインフラストラクチャの管理において、Infrastructure as Language (IaL)が注目を集めています。今回は、IaLの力を借りて、AWS FargateにStreamlitアプリケーションをデプロイする過程を詳しく解説します。驚くほど簡単に、ポチポチとクリックするだけでデプロイが完了する様子をお見せしましょう。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">Cursor✖IaL要件定義書プロンプトでAWS FargateでのStreamlitアプリケーションデプロイしてみた！<br>マジでポチポチでデプロイできた！ <a href="https://t.co/Cl0vE6IXig">https://t.co/Cl0vE6IXig</a> <a href="https://t.co/epxiXz3iMR">pic.twitter.com/epxiXz3iMR</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1843211956058251731?ref_src=twsrc%5Etfw">October 7, 2024</a></blockquote> charset="utf-8"></script>

## IaLとは？Infrastructure as Languageの威力

Infrastructure as Language（IaL）は、自然言語での要件定義とAIによるコード生成を組み合わせた革新的なアプローチです。このアプローチにより、インフラ構築のプロセスが大幅に簡素化され、効率が向上します。

今回のプロジェクトでは、IaLを活用してAWS FargateにStreamlitアプリケーションをデプロイするためのTerraformコードを生成しました。

## プロジェクトの概要

今回のプロジェクトの目標は以下の通りです：

1. StreamlitアプリケーションをAWS Fargate上にデプロイする
2. Terraformを使用してインフラストラクチャをコード化する
3. セキュアで拡張性のあるアーキテクチャを構築する

## 主要なコンポーネント

プロジェクトは以下の主要なコンポーネントで構成されています：

1. Streamlitアプリケーション（`app.py`）
2. Dockerファイル（`Dockerfile`）
3. Terraformの設定ファイル（`main.tf`, `variables.tf`, `outputs.tf`, `terraform.tfvars`）

## Streamlitアプリケーションの概要

今回デプロイするStreamlitアプリケーションは、「にゃんこカフェ ダッシュボード」です。このダッシュボードは、架空のねこカフェの来店者数や人気の猫ちゃんのデータを視覚化しています。

以下は`app.py`の一部です：

```python
import streamlit as st
import pandas as pd
import plotly.express as px

# ページ設定
st.set_page_config(page_title="にゃんこカフェ ダッシュボード", layout="wide")

# タイトル
st.title("にゃんこカフェ ダッシュボード")

# 仮のデータ
visitors_data = pd.DataFrame({
    'month': ['1月', '2月', '3月', '4月', '5月', '6月'],
    'visitors': [1200, 1900, 1600, 2200, 2500, 2300]
})

# グラフの作成
st.subheader("月間来店者数")
fig = px.bar(visitors_data, x='month', y='visitors', text='visitors')
st.plotly_chart(fig, use_container_width=True)

# ... (その他のコード)
```

## Dockerfileの作成

アプリケーションをコンテナ化するために、以下のようなDockerfileを作成しました：

```dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip3 install -r requirements.txt

COPY . .

EXPOSE 8501
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
ENTRYPOINT ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
```

## Terraformコードの生成

IaL要件定義書プロンプトを使用して、以下のTerraformファイルを生成しました：

1. `main.tf`: 主要なリソース定義
2. `variables.tf`: 変数の定義
3. `outputs.tf`: 出力の定義
4. `terraform.tfvars`: 変数の値

以下は`main.tf`の一部です：

```hcl
# VPCの作成
resource "aws_vpc" "main" {
  cidr_block = var.vpc_cidr

  tags = {
    Name = "${var.project_name}-vpc"
  }
}

# ECSクラスターの作成
resource "aws_ecs_cluster" "main" {
  name = "${var.project_name}-cluster"
}

# タスク定義の作成
resource "aws_ecs_task_definition" "app" {
  family                   = "${var.project_name}-task"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = var.task_cpu
  memory                   = var.task_memory
  execution_role_arn       = aws_iam_role.ecs_execution_role.arn

  container_definitions = jsonencode([
    {
      name  = "${var.project_name}-container"
      image = var.container_image
      portMappings = [
        {
          containerPort = 8501
          hostPort      = 8501
        }
      ]
      # ... (その他の設定)
    }
  ])
}

# ... (その他のリソース定義)
```

## デプロイ手順

1. リポジトリのクローン
2. Dockerイメージのビルドとプッシュ
3. `terraform.tfvars`の更新
4. Terraformの初期化と適用

```bash
git clone https://github.com/your-repo/s13_streamlit-fargate-ial.git
cd s13_streamlit-fargate-ial

docker build -t your-docker-hub-username/nyanko-cafe-app:latest .
docker push your-docker-hub-username/nyanko-cafe-app:latest

# terraform.tfvarsを編集

terraform init
terraform apply
```

## まとめ

IaL要件定義書プロンプトを使用することで、複雑なAWS Fargateデプロイメントを驚くほど簡単に実現できました。この方法を使えば、インフラストラクチャの構築と管理が格段に効率化され、開発者はアプリケーションの機能開発により多くの時間を割くことができます。

今回のプロジェクトで使用したコードやファイルは、GitHubリポジトリで公開していますので、ぜひ参照してみてください。IaLの力を体験し、あなたのプロジェクトにも活用してみてはいかがでしょうか？


## リポジトリ

https://github.com/Sunwood-ai-labs/aws-terraform-sandbox/tree/main/sandbox/s13_streamlit-fargate-ial

<script async src="https://platform.twitter.com/widgets.js"