IaLを活用したAWS FargateでのStreamlitアプリケーションデプロイ - Terraformによる自動化の実践

## はじめに

近年、インフラストラクチャ管理の分野で注目を集めているのが「IaL（Infrastructure as Language）」という概念です。IaLは、自然言語での要件定義とAIによるコード生成を組み合わせることで、インフラ構築のプロセスを大幅に簡素化し、効率化することを目指しています。

本記事では、IaLの概念を活用し、AWS FargateでStreamlitアプリケーションをデプロイする過程を詳しく解説します。Terraformを使用したインフラストラクチャのコード化（IaC）と、Dockerを用いたアプリケーションのコンテナ化を通じて、最新のクラウドデプロイメント技術を学びましょう。

## IaL（Infrastructure as Language）とは

IaLは、インフラストラクチャ管理に自然言語処理とAIを導入することで、従来のIaC（Infrastructure as Code）をさらに進化させた概念です。IaLを活用することで、エンジニアは複雑なインフラ構成を自然言語で記述し、AIがそれを解釈してTerraformなどのIaCコードに変換します。

今回の例では、Claude 3.5というAI言語モデルを使用して、StreamlitアプリケーションのAWS Fargateデプロイメントに必要なTerraformコードとDockerfile、そしてStreamlitアプリケーション自体を生成しました。

## プロジェクト概要

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">Fargate寄りのサーバーレスでIaL (Infrastructure as Language)ができるように実験中。。。<br>取り敢えずFargate✖Streamlitで起動する練習ができた<br>これを要件定義書に落とし込めばイケるはず！ <a href="https://t.co/8Snag1kTd4">https://t.co/8Snag1kTd4</a> <a href="https://t.co/WMVmzGq0QG">pic.twitter.com/WMVmzGq0QG</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1842879409923170418?ref_src=twsrc%5Etfw">October 6, 2024</a></blockquote> 

本プロジェクトでは、以下の主要コンポーネントを使用しています：

1. Streamlit: Pythonベースのデータ可視化ウェブアプリケーションフレームワーク
2. Docker: アプリケーションのコンテナ化
3. AWS Fargate: サーバーレスコンテナ実行環境
4. Terraform: インフラストラクチャのコード化と自動デプロイメント

それでは、各コンポーネントの詳細と実装について見ていきましょう。

## Streamlitアプリケーション

まず、`app.py`にあるStreamlitアプリケーションのコードを見てみましょう：

```python
import streamlit as st
import pandas as pd
import numpy as np
import altair as alt

st.title('Simple Streamlit App V2')

# Generate some random data
data = pd.DataFrame({
    'x': np.random.randn(100),
    'y': np.random.randn(100)
})

# Create a scatter plot using Altair
chart = alt.Chart(data).mark_circle().encode(
    x='x',
    y='y'
)

# Display the chart using Streamlit
st.altair_chart(chart, use_container_width=True)

st.write('This is a simple Streamlit app that generates random data and displays a scatter plot.')
```

このコードは、ランダムなデータを生成し、散布図を表示する簡単なStreamlitアプリケーションです。主な機能は以下の通りです：

1. ランダムなx座標とy座標のデータを生成
2. Altairライブラリを使用して散布図を作成
3. Streamlitの`st.altair_chart`関数を使用してチャートを表示

このシンプルなアプリケーションは、データ可視化の基本的な例を示しています。実際のプロジェクトでは、このコードをベースにさらに複雑な分析や可視化を行うことができます。

## Dockerfileによるコンテナ化

次に、アプリケーションをコンテナ化するための`Dockerfile`を見てみましょう：

```dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

EXPOSE 8501

CMD ["streamlit", "run", "app.py"]
```

このDockerfileは以下の手順でアプリケーションをコンテナ化します：

1. Python 3.9のスリムイメージを基本イメージとして使用
2. 作業ディレクトリを `/app` に設定
3. `requirements.txt` ファイルをコピーし、必要なPythonパッケージをインストール
4. `app.py` ファイルをコンテナにコピー
5. Streamlitのデフォルトポート8501を公開
6. コンテナ起動時に `streamlit run app.py` コマンドを実行

このDockerfileを使用してイメージをビルドし、DockerHubにプッシュすることで、AWS Fargateで実行可能なコンテナイメージが作成されます。

## Terraformによるインフラストラクチャのコード化

最後に、`main.tf`ファイルに記述されたTerraformコードの主要部分を見ていきましょう：

```hcl
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name = "streamlit-vpc"
  }
}

resource "aws_subnet" "public" {
  count                   = 2
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.${count.index}.0/24"
  availability_zone       = data.aws_availability_zones.available.names[count.index]
  map_public_ip_on_launch = true

  tags = {
    Name = "streamlit-public-subnet-${count.index + 1}"
  }
}

resource "aws_ecs_cluster" "streamlit_cluster" {
  name = "streamlit-cluster"
}

resource "aws_ecs_task_definition" "streamlit_task" {
  family                   = "streamlit-task"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "256"
  memory                   = "512"
  execution_role_arn       = aws_iam_role.ecs_execution_role.arn

  container_definitions = jsonencode([{
    name  = "streamlit-container"
    image = "makisunwood/streamlit-app:latest"
    portMappings = [{
      containerPort = 8501
      hostPort      = 8501
    }]
  }])
}

resource "aws_ecs_service" "streamlit_service" {
  name            = "streamlit-service"
  cluster         = aws_ecs_cluster.streamlit_cluster.id
  task_definition = aws_ecs_task_definition.streamlit_task.arn
  launch_type     = "FARGATE"
  desired_count   = 1

  network_configuration {
    subnets          = aws_subnet.public[*].id
    assign_public_ip = true
    security_groups  = [aws_security_group.streamlit_sg.id]
  }

  load_balancer {
    target_group_arn = aws_lb_target_group.streamlit_tg.arn
    container_name   = "streamlit-container"
    container_port   = 8501
  }
}
```

このTerraformコードは、以下の主要なAWSリソースを作成します：

1. VPCとパブリックサブネット
2. ECSクラスター
3. ECSタスク定義（Fargateで実行）
4. ECSサービス
5. Application Load Balancer（ALB）とターゲットグループ

これらのリソースを組み合わせることで、StreamlitアプリケーションをAWS Fargate上で実行し、インターネットからアクセス可能な環境を構築しています。

## IaLの利点と今後の展望

今回のプロジェクトでは、IaLの概念を活用してインフラストラクチャのコード化を行いました。AI（Claude 3.5）が自然言語の指示を解釈し、適切なTerraformコード、Dockerfile、そしてStreamlitアプリケーションのコードを生成しました。

IaLアプローチの主な利点は以下の通りです：

1. 開発速度の向上：複雑なインフラストラクチャ設定を自然言語で記述できるため、開発プロセスが迅速化されます。
2. エラーの減少：AIによるコード生成により、人為的ミスを減らすことができます。
3. 学習曲線の緩和：インフラストラクチャの専門知識が少ないチームメンバーでも、自然言語で要件を記述できます。
4. ドキュメンテーションの自動化：生成されたコードには、AIによる詳細なコメントやドキュメンテーションが含まれます。

今後、IaLの技術がさらに進化することで、クラウドインフラストラクチャの管理がより直感的かつ効率的になることが期待されます。

## まとめ

本記事では、IaL（Infrastructure as Language）の概念を活用し、AWS FargateでStreamlitアプリケーションをデプロイする方法を詳しく解説しました。Terraformによるインフラストラクチャのコード化、Dockerを使用したアプリケーションのコンテナ化、そしてStreamlitによるデータ可視化アプリケーションの作成を通じて、最新のクラウドデプロイメント技術を学びました。

IaLアプローチは、インフラストラクチャ管理の未来を示唆しており、今後ますます重要になっていくでしょう。エンジニアの皆さんも、ぜひIaLの概念を取り入れ、より効率的なインフラストラクチャ管理を目指してみてはいかがでしょうか。


## リポジトリ

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


<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>