IaLを活用したAWS FargateへのStreamlitアプリケーションのデプロイ

## はじめに

インフラストラクチャ・アズ・コード（IaC）の次世代技術として注目を集めているインフラストラクチャ・アズ・ランゲージ（IaL）。本記事では、IaLを活用してAWS FargateにStreamlitアプリケーションをデプロイする過程を詳細に解説します。AIによるコード生成と自然言語での要件定義を組み合わせることで、インフラ構築のプロセスがいかに簡素化されるかをご覧いただけます。

## プロジェクト概要

本プロジェクトでは、ねこねこカンパニーの工場ダッシュボードをStreamlitで作成し、AWS Fargateにデプロイします。主な特徴は以下の通りです：

- Streamlitを使用した対話的なダッシュボード
- AWS FargateとECSを利用したサーバーレスデプロイ
- Terraformによるインフラのコード化
- IPホワイトリストによるセキュアなアクセス制御

## IaLによる要件定義

IaLでは、自然言語で要件を定義します。以下は、本プロジェクトで使用した要件定義の一部です：

https://github.com/Sunwood-ai-labs/aws-terraform-sandbox/blob/main/docs/IAL_REQUIREMENTS_STREAMLIT_FARGATE_DEPLOYMENT.MD

```markdown
# IaL要件定義: StreamlitアプリケーションのAWS Fargateデプロイメント

## 0. プロジェクト概要
- Streamlitアプリケーションを AWS Fargate 上にデプロイするための Terraform コードを生成すること
- セキュアで拡張性のあるインフラストラクチャを構築すること
- 初心者でも理解しやすい構造とコメントを含めること

## 1. ファイル構造とコメント
- [ ] プロジェクトを main.tf, variables.tf, outputs.tf, terraform.tfvars の4つのファイルに分割すること
- [ ] 各ファイルの冒頭に、そのファイルの目的と内容を説明する詳細なコメントを追加すること
- [ ] コメントは初心者でも理解できる平易な言葉で書くこと

## 2. プロバイダー設定
- [ ] AWS プロバイダーを適切に設定し、リージョンを指定すること
- [ ] プロバイダーのバージョンを明示的に指定すること

...


```

これらの要件をAIに入力することで、Terraformスクリプトが自動生成されます。

## Terraformスクリプトの生成と調整

AIによって生成されたTerraformスクリプトは、要件に基づいて主要なAWSリソースを定義します。以下は、`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"
}

# ALBの作成
resource "aws_lb" "main" {
  name               = "${var.project_name}-alb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.alb.id]
  subnets            = aws_subnet.public[*].id

  tags = {
    Name = "${var.project_name}-alb"
  }
}
```

生成されたスクリプトは、必要に応じて手動で調整できます。例えば、特定のリソースの設定を変更したり、追加のタグを付けたりすることが可能です。

## デプロイメントプロセス

デプロイメントは以下の手順で行います：

1. Dockerイメージのビルド
2. Amazon ECRへのイメージプッシュ
3. Terraformの初期化と適用

```bash
# Dockerイメージのビルド
docker build -t nyanko-cafe-app .

# ECRへのプッシュ
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <YOUR-ACCOUNT-ID>.dkr.ecr.ap-northeast-1.amazonaws.com
docker tag nyanko-cafe-app:latest <YOUR-ACCOUNT-ID>.dkr.ecr.ap-northeast-1.amazonaws.com/nyanko-cafe-app:latest
docker push <YOUR-ACCOUNT-ID>.dkr.ecr.ap-northeast-1.amazonaws.com/nyanko-cafe-app:latest

# Terraformの適用
cd Terraform
terraform init
terraform apply
```

## アプリケーションの更新と再デプロイ

アプリケーションを更新した後、以下のPowerShellスクリプトを使用して簡単に再デプロイできます：

https://github.com/Sunwood-ai-labs/aws-terraform-sandbox/blob/main/sandbox/s15_streamlit-fargate-whitelist/script/update-fargate-image.ps1

```powershell
# update-fargate-image.ps1
$region = "ap-northeast-1"
$accountId = "498218886114"
$ecrRepo = "nyanko-cafe-app"
$imageTag = "latest"
$ecrUri = "${accountId}.dkr.ecr.${region}.amazonaws.com"
$imageName = "${ecrUri}/${ecrRepo}:${imageTag}"
$clusterName = "streamlit-nyanko-cafe-cluster"
$serviceName = "streamlit-nyanko-cafe-service"

# Dockerイメージのビルドとプッシュ
docker build -t nyanko-cafe-app:$imageTag .
aws ecr get-login-password --region $region | docker login --username AWS --password-stdin $ecrUri
docker tag nyanko-cafe-app:$imageTag $imageName
docker push $imageName

# ECSサービスの更新
aws ecs update-service --cluster $clusterName --service $serviceName --force-new-deployment
```

このスクリプトを実行することで、新しいバージョンのアプリケーションを簡単にデプロイできます。

## まとめ

IaLを活用することで、インフラストラクチャの構築と管理が大幅に簡素化されます。自然言語での要件定義とAIによるコード生成を組み合わせることで、開発者はインフラストラクチャの細かい実装詳細に悩まされることなく、ビジネスロジックに集中できます。

本記事で紹介したアプローチは、AWS FargateへのStreamlitアプリケーションのデプロイを例に取りましたが、この手法は他のクラウドプロバイダーや異なる種類のアプリケーションにも適用可能です。IaLは、インフラストラクチャ管理の未来を切り開く革新的な技術と言えるでしょう。

## リポジトリ

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