技術(tech)

スマートフォンでちょこっと開発!Claude Code + AWS EC2で月額300円の気軽なAI開発環境

この記事で分かること

  • Claude Code CLIを活用したAI駆動開発環境の構築
  • スマートフォンからAWS EC2への安全な接続方法
  • Tailscale VPNを使った安全なネットワーク構築
  • サーバー代月額300円で実現するAI開発環境の具体的実装手順
  • Terraform + Lambdaによる自動化・コスト管理

📋 目次

  1. なぜスマートフォン開発環境が必要なのか
  2. 技術選定:なぜTailscaleなのか
  3. システム構成とセキュリティ設計
  4. 実装手順:基盤構築編
  5. 実装手順:セキュリティ編
  6. 運用とコスト管理

なぜスマートフォン開発環境が必要なのか

🤖 プログラミングの未来への不安

最近のAIコーディングツールを見ていて、正直なところ不安になりました:

「将来的に、コードを手で書く必要はなくなるのでは?」

Claude Code、GitHub Copilot、Cursor…これらのツールは既に、自然言語の指示だけで完全なコードを生成できます。つまり:

従来はキーボードでコードを1行ずつ書いていましたが、現在は「〇〇な機能を作って」と指示するだけで完全なコードが生成されます。

もしそうなら、重いPCを持ち歩く意味は?スマートフォンから指示するだけで十分では?

この心配が今回の構築のきっかけでした。

📱 新しい開発スタイルの提案

あなたはこんな経験ありませんか?

通勤中にふと浮かんだアイデアをすぐコードで試したい、家でゴロゴロしながらでも気軽にコーディングしたい、AIペアプログラミングを外出先でも活用したい、外出先で緊急のバグ修正が必要になった、重いノートPCを持ち歩かずに軽量開発をしたい、個人開発用の常時稼働サーバーのコストが気になる、といった悩みです。

AIが主役の時代なら、スマートフォン一台で本格的な開発環境にアクセスできるシステムが理想的です。

この記事で実現すること

「指示するだけ」の開発体験をClaude Code CLIによるAI駆動開発で実現し、サーバー代月額300円という超低コストでの開発環境を構築します。セキュアなVPN接続による安全性確保、どこからでもアクセス可能な柔軟性、自動化されたコスト管理・運用を提供します。

実装結果: AWS EC2上にClaude Code CLIを含むAI開発環境を構築し、スマートフォンからTailscale VPN経由でセキュアに接続。サーバー代月額$3-4(約300-400円)という低コストで、通勤中やゴロゴロしながらでも気軽にちょこっと開発できる環境を実現しました。

料金の前提条件: 移動中・家でゴロゴロしながらのコーディングを想定し、稼働時間は1日1-2時間程度(自動停止機能で無駄なコストを削減)。サーバー代は月額3-4ドル(約300-400円)でAWSサーバー代のみ。Claude Codeは別途Anthropic社への料金が発生します。

⚠️ デメリット・課題: 手動停止の面倒さ(こまめに停止するのは現実的に面倒)、スポットインスタンスの不安(予告なく停止される可能性)、接続の複雑さ(Tailscale設定やSSH接続の初期設定が必要)、長時間利用時のコスト(1日5-8時間使うと月額10-15ドル程度)があります。

⚠️ 重要なセキュリティ注意点: 接続時は必ずTailscale IPアドレス(100.x.x.x)を使用してください。パブリックIPでの接続はセキュリティ設定により意図的にブロックされています。実際のTailscale IPアドレスは絶対に公開しないでください。この記事では実際のIPアドレスは伏せ字(xxx)で表示しています。

使用技術: Claude Code CLI、AWS EC2、Tailscale VPN、Terraform、Lambda、EventBridge

なぜClaude Code CLIなのか

この開発環境の最大の特徴は、Claude Code CLIによるAI駆動開発です。

Claude Code CLIとは

Anthropic社のAIペアプログラミングツール。自然言語でコード生成・レビュー・デバッグが可能。

実際の使用例

# スマートフォンでの実際の開発例
$ claude "Express.jsでREST APIを作って、ユーザー認証機能付きで"
# → 完全なコードが瞬時に生成

$ claude "このコードのセキュリティ問題をチェックして"
# → 脆弱性検出と修正コード提示

なぜTailscaleを選んだのか

VPN技術の選択肢は多数ありますが、実際に検討してTailscaleを選んだ理由をお話しします

無料で使える

個人利用なら完全無料(最大20デバイス)です。商用VPNサービスは月額5-15ドルが相場なので、これだけでもかなりお得です。OpenVPNやWireGuardの自前構築も手間とコストがかかりますが、Tailscaleなら即座に使えます。

セキュアな通信

P2P暗号化通信でデバイス間で直接暗号化接続するため、中間サーバーを経由しません。

設定の簡単さ

自動設定により複雑なファイアウォール設定が不要で、アプリをインストールするだけです。Windows、Mac、Linux、Android、iOS全てに対応しています。

システム構成図

全体アーキテクチャ

実装したシステム全体の構成:

スマートフォン側: Android スマートフォン、Termux アプリ、Tailscale VPNで構成されています。

Tailscale ネットワーク: P2P暗号化通信による安全な接続を提供します。

AWS クラウド: EC2 インスタンス(100.xxx.xx.xx)、セキュリティグループ(Tailscale IPのみ許可)、Lambda 自動停止(23:00, 13:00 JST)、EventBridge(定期実行)、VPC(10.0.0.0/16)で構築されています。

AI開発環境: Ubuntu 22.04、Node.js 20 LTS、Claude Code CLI(AIペアプログラミング)、Git, tmux, vimがインストールされています。

セキュリティ構成

多層防御によるセキュリティ設計を採用しました:

セキュリティ層: パブリックIP(xx.xx.xxx.xxx)、セキュリティグループ、SSH鍵認証、Tailscale VPNによる多層防御を実装しています。

接続経路比較: 危険な接続(インターネット経由、パブリックIP直接)は避け、セキュアな接続(Tailscale VPN経由、暗号化トンネル)を採用しています。

1. 🏗️ 基盤構築

コスト最適化されたEC2設定

まず、スポットインスタンスを使用してコスト最適化されたEC2インスタンスを設定します:

# ec2.tf
resource "aws_instance" "claude_code_server" {
  # コスト最適化のためのスポットインスタンス設定
  instance_market_options {
    market_type = "spot"
    spot_options {
      instance_interruption_behavior = "stop"
      spot_instance_type            = "persistent"
      max_price                     = "0.005"  # 上限: $0.005/時間
    }
  }

  ami           = "ami-0d52744d6551d851e"  # Ubuntu 22.04 LTS
  instance_type = "t3.micro"               # 1vCPU, 1GB RAM
  subnet_id     = aws_subnet.public.id

  vpc_security_group_ids = [aws_security_group.claude_code_sg.id]

  # データ永続化のためのEBS設定
  root_block_device {
    volume_type           = "gp3"
    volume_size           = 20
    delete_on_termination = false  # 終了時にデータを保持
    encrypted            = true
  }

  user_data = templatefile("user-data.sh", {
    enable_tailscale   = var.enable_tailscale
    tailscale_auth_key = var.tailscale_auth_key
  })

  tags = {
    Name    = "claude-code-server"
    Project = "claude-code-smartphone"
    Type    = "development"
  }
}

実装ポイント: スポットインスタンス vs オンデマンドインスタンスで70%のコスト削減を実現し、EBSボリュームはインスタンス停止後もデータが永続化されます。暗号化されたEBSボリュームでセキュリティを確保し、最大価格設定でコスト超過を防止しています。

Lambdaによる自動コスト管理

EC2自動停止のためのLambda関数:

# lambda/auto_stop_ec2.py
import boto3
import json
import logging
from datetime import datetime

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    """
    特定のタグを持つEC2インスタンスを自動停止
    実行時刻: 毎日23時JST、平日13時JST
    """

    ec2 = boto3.client('ec2')

    try:
        # タグでインスタンスを検索
        response = ec2.describe_instances(
            Filters=[
                {'Name': 'tag:Project', 'Values': ['claude-code-smartphone']},
                {'Name': 'instance-state-name', 'Values': ['running']}
            ]
        )

        instance_ids = []
        for reservation in response['Reservations']:
            for instance in reservation['Instances']:
                instance_ids.append(instance['InstanceId'])
                logger.info("Found running instance: " + instance['InstanceId'])

        if not instance_ids:
            logger.info("No running instances found")
            return {'statusCode': 200, 'body': json.dumps('No instances to stop')}

        # インスタンス停止
        stop_response = ec2.stop_instances(InstanceIds=instance_ids)
        logger.info("Stopping instances: " + str(instance_ids))

        return {
            'statusCode': 200,
            'body': json.dumps({
                'message': 'Successfully stopped ' + str(len(instance_ids)) + ' instances',
                'instances': instance_ids,
                'timestamp': datetime.utcnow().isoformat()
            })
        }

    except Exception as e:
        logger.error("Error stopping instances: " + str(e))
        return {'statusCode': 500, 'body': json.dumps({'error': str(e)})}

実装意図:
タグベースの動的インスタンス検索で柔軟性を確保し、詳細なログ出力とエラーハンドリングを実装しています。毎日23時と平日13時に自動実行して確実にコスト削減を行います。

2. 🔒 セキュリティ実装

セキュリティグループ設定

Tailscale IPのみからのSSH接続を許可する設定です:

# security_group.tf
resource "aws_security_group" "claude_code_sg" {
  name_prefix = "claude-code-sg"
  vpc_id      = aws_vpc.main.id

  tags = {
    Name    = "claude-code-security-group"
    Project = "claude-code-smartphone"
  }
}

# Tailscale Mac IP
resource "aws_security_group_rule" "ssh_tailscale_mac" {
  type              = "ingress"
  from_port         = 22
  to_port           = 22
  protocol          = "tcp"
  cidr_blocks       = ["100.xxx.x.xx/32"]  # 実際のMac Tailscale IP
  security_group_id = aws_security_group.claude_code_sg.id
  description       = "SSH from Mac via Tailscale"
}

# Tailscale Android IP
resource "aws_security_group_rule" "ssh_tailscale_android" {
  type              = "ingress"
  from_port         = 22
  to_port           = 22
  protocol          = "tcp"
  cidr_blocks       = ["100.xxx.x.xx/32"]  # 実際のAndroid Tailscale IP
  security_group_id = aws_security_group.claude_code_sg.id
  description       = "SSH from Android via Tailscale"
}

# EC2 Instance Connect (緊急時用)
resource "aws_security_group_rule" "ssh_ec2_instance_connect" {
  type              = "ingress"
  from_port         = 22
  to_port           = 22
  protocol          = "tcp"
  cidr_blocks       = ["3.112.23.0/29"]  # EC2 Instance Connect IP範囲
  security_group_id = aws_security_group.claude_code_sg.id
  description       = "SSH from EC2 Instance Connect"
}

# アウトバウンド全許可
resource "aws_security_group_rule" "egress_all" {
  type              = "egress"
  from_port         = 0
  to_port           = 0
  protocol          = "-1"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.claude_code_sg.id
}

動作原理: Tailscaleが割り当てる100.x.x.xのIPアドレスのみを許可することで、認証されたデバイスからのみアクセス可能になります。この設定により、パブリックIPからの直接アクセスは完全にブロックされます。

Tailscale統合

Tailscale認証キーの管理とEC2での自動設定を行います。

EC2初期化スクリプト

EC2起動時の自動設定スクリプトです:

#!/bin/bash
# user-data.sh - EC2起動時の自動設定

# 基本パッケージ更新
apt update && apt upgrade -y

# Node.js 20 LTS インストール
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs

# 必要パッケージインストール
apt-get install -y git curl tmux vim htop unzip python3 python3-pip

# Tailscale インストール
curl -fsSL https://tailscale.com/install.sh | sh

# Tailscale設定(条件分岐)
# 注意: 以下はTerraformテンプレート記法です
if [ "ENABLE_TAILSCALE" = "true" ] && [ "TAILSCALE_AUTH_KEY" != "" ]; then
  sudo tailscale up --authkey=TAILSCALE_AUTH_KEY --ssh --accept-routes
else
  echo "Tailscale installed but not configured"
fi

# Claude Code CLI インストール
npm install -g @anthropic-ai/claude-code

# SSH鍵設定(スポット再起動対応)
mkdir -p /home/ubuntu/.ssh
# 注意: 実際の公開鍵は各自の環境に応じて設定してください
echo "ssh-rsa YOUR_PUBLIC_KEY_HERE" >> /home/ubuntu/.ssh/authorized_keys
chmod 700 /home/ubuntu/.ssh
chmod 600 /home/ubuntu/.ssh/authorized_keys
chown -R ubuntu:ubuntu /home/ubuntu/.ssh

# 基本設定
sudo -H -u ubuntu git config --global init.defaultBranch main
sudo -H -u ubuntu git config --global core.editor vim

# エイリアス設定
cat >> /home/ubuntu/.bashrc << 'EOF'
alias ll='ls -alF'
alias ..='cd ..'
alias dev='cd ~/development'
alias c='claude'
alias t='tmux'
EOF

chown -R ubuntu:ubuntu /home/ubuntu

実装ポイント:
Terraform template機能でTailscale設定の条件分岐を行い、認証キーによるTailscale自動接続を実現し、Claude Code CLIを含む開発環境セットアップを自動化しています。

セキュリティポイント:

  1. 認証キー管理: terraform.tfvarsで機密情報を分離
  2. IP制限: 100.x.x.x/32の厳格な制限
  3. 多層認証: Tailscale認証 + SSH認証
  4. 自動設定: user-data.shでの一貫した環境構築

まとめ:サーバー代月額300円で実現するAI開発環境

🎉 実装成果

サーバー代月額$3.2(約300円)でスマートフォンからの気軽なAI開発環境を構築できました。

利用想定: 移動中・家でゴロゴロしながらのちょこっと開発(1日1-2時間程度)

主な成果: Claude Code CLIで思いついたアイデアをすぐコード化できる気軽な開発体験を実現し、従来のVPS(15-20ドル/月)から70%のコスト削減を達成しました。Tailscale VPNによる安全なプライベート接続でセキュリティを強化し、Lambda + EventBridgeによる自動停止・コスト管理で運用を自動化し、通勤中でもベッドでもアクセス可能な柔軟性を提供します。

重要: 上記はAWSサーバー代のみ(1日1-2時間利用想定)。Claude Code利用料は別途必要です。

現実的な制約: 完全自動化しても、使いたい時に停止していることがある自動停止の限界、AWS側の都合で予告なく停止される場合があるスポットインスタンスのリスク、Tailscale、SSH、Terraformの設定は初心者には難しい初期設定の複雑さ、モバイル回線の品質に開発体験が左右されるネットワーク依存という課題があります。

学んだポイント

  1. 技術選定の重要性: Tailscaleの採用がセキュリティとコストを両立
  2. スポットインスタンス活用: 適切な設定で70%のコスト削減を実現
  3. 自動化の価値: 運用コストと人的ミスを大幅削減
  4. セキュリティ設計: 多層防御による堅牢な環境構築
  5. 現実とのバランス: 理想的な自動化と実用性のトレードオフ

今後の展望

  • CI/CD統合: GitHub Actionsとの連携強化
  • 運用改善: スポットインスタンスの制約を軽減する仕組み

応用可能性

この構成は以下の用途にも応用できます:

  • 個人プロジェクト開発: 低コストでの実験環境
  • 学習・研究: プログラミング学習用サーバー
  • プロトタイピング: アイデア検証用の迅速な環境構築
  • リモートワーク: セキュアな開発環境へのアクセス

参考リンク