AWSのLightsailでスモールサービスを立ち上げる

# AWSのLightsailって何？
通常AWSはご存知の通り従量課金で使ったら使った分課金しますよーっていうサービスです。潤沢な資金があればAWSをガンガン使って良いのでしょうけれども、小さなサービスを立ち上げるのに月々1万円とか2万円とかとられるとしんどいものがあります・・・。

AWS Lightsailは月額固定のWEBアプリケーションを立ち上げるのに最低限のサービスを提供してくれるサービスです。EC2とかRDSとかの概念はいったん忘れてこれは別のVPSサービスだと考えるとイメージしやすいです。

# 料金シミュレーション
IPv4アドレスだけのLinuxインスタンスの最低スペックで 5USD/月
データベースの最低スペックで 15USD/月
オブジェクトストレージの最低スペックで 1USD/月

21USDだから1ドル157円として(円安つらい・・・)
21 x 157 = 3,297JPY

月々まあ3,500円ぐらいで必要最低限のプラットフォームが安心と信頼のAWSで実現できると考えると安いですよね？(AWSに何ももらってませんよ！むしろください！)

## (余談)安心と信頼はいらんからとにかく価格重視で
その場合はレンタルサーバーでしょう。500円ぐらいでたしかあったと思いますので、そちらを利用してください。ただし共用サーバを採用しているところが多いはずなので、他のユーザの利用率の影響を受けますしオペレーションなどでデータぶっ壊されたみたいなことは年に1回ぐらいニュースになってますのであくまで自己責任でということになるでしょう・・・。

想像ですが、最近はcontainerな構成になってると思われるからパフォーマンスはそこまで上下しないのかなとか思ったり。

# せっかくなのでterraformでやってみましょう
## aws.tf
aws(モジュール)つかいまっせという宣言ですね。とくになんの変哲もなく・・・。
```terraform
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}
```

## web.tf
ipv4だけのlinuxインスタンスを一つ。ipv6で通信(ssh)できる環境ならipv6だけのほうが料金は安いです。

```terraform
resource "aws_lightsail_instance" "hogeproject" {
  name              = "wwwhogehoge101"
  availability_zone = "ap-northeast-1a"
  blueprint_id      = "ubuntu_22_04"
  bundle_id         = "micro_3_0"

  ip_address_type = "ipv4"

  # ↓なくても動作には支障はないです
  add_on {
    type          = "AutoSnapshot"
    snapshot_time = "19:00"
    status        = "Enabled"
  }
  tags = {
    name = "hogeproject"
  }
}
```

## static-ip.tf
基本は動的IPアドレスなので、それだと再起動かかったら変わるので困ります。
静的IPアドレスを割り当てます。

```terraform
 resource "aws_lightsail_static_ip" "hogehogeproject" {
   name = "hogehogeproject-static-ip"
 }

 resource "aws_lightsail_static_ip_attachment" "hogehogeproject" {
   static_ip_name = aws_lightsail_static_ip.hogehogeproject.id
   instance_name  = aws_lightsail_instance.hogehogeproject.name
 }
 ```

 ## port.tf
基本は全閉じになっていますので必要に応じてポートを開けます。この例では22,80,443ポートがフルオープンになりますのでご注意ください。

 ```terraform
  resource "aws_lightsail_instance_public_ports" "hogehogeproject" {
   instance_name = aws_lightsail_instance.hogehogeproject.name

   port_info {
     protocol  = "tcp"
     from_port = 22
     to_port   = 22
     cidrs     = [ "0.0.0.0/0" ]
   }

   port_info {
     protocol  = "tcp"
     from_port = 80
     to_port   = 80
     cidrs     = [ "0.0.0.0/0" ]
   }

   port_info {
     protocol  = "tcp"
     from_port = 443
     to_port   = 443
     cidrs     = [ "0.0.0.0/0" ]
   }
 }
 ```
 
## db.tf
データベースですね、MySQLを指定しています。

```terraform
 resource "aws_lightsail_database" "hogehogeproject" {
   relational_database_name     = "hogehogeprojectdb"
   availability_zone            = "ap-northeast-1a"
   master_database_name         = "hogehogeproject"

   # 直接パスワードを書かなきゃいけないのがつらい。rdsの場合は暗号化したものを使える。
   master_password              = "hogehogeproject"

   master_username              = "hogehogeproject"
   blueprint_id                 = "mysql_8_0"
   bundle_id                    = "micro_2_0"
   preferred_backup_window      = "20:00-20:30"
   preferred_maintenance_window = "Sun:19:00-Sun:19:30"
   final_snapshot_name          = "HogehogeProjectSnapshot"
   apply_immediately            = true
   
   tags = {
     name = "hogehogeproject"
   }
}
```

## object-storage.tf
まあ裏でS3動いてるんですけどね・・・。

```terraform
resource "aws_lightsail_bucket" "hogehogeproject" {
  name      = "hogehogeproject"
  bundle_id = "small_1_0"

  tags = {
    name = "hogehogeproject"
  }
}
```

これでterraform applyしてもらったら、linuxのインスタンスとデータベースとオブジェクトストレージがLightsailにできあがります。

# よくある質問
## どうやってSSHするんですか？
WEBコンソールからsshの秘密鍵をダウンロードできますので、ダウンロードしてください。

## オブジェクトストレージのアクセス方法は？
WEBコンソールからkeyとsecretが発行できますので、あとはS3と同じです。

## DBはIP制限などしなくてよい？
DBはインスタンスしか繋げない仕様ですので制限は不要です。(設定画面もないです)

## データベースの操作にGUI使いたい・・・
sshでポートフォワードしてください。
ターミナルで、sshポートフォワードを立ち上げときます。
```
ssh -L 13306:データベースのホスト名:3306 -N linuxインスタンスのIPもしくは.ssh/configに書いたホスト名
```
接続情報を
host: localhost
port: 13306
で設定してあげるとDB操作可能かと思います。

## ロードバランサはないんですか
あります！今回つかってないだけです。

# スモールビジネスにはAWS Lightsail!
安くて安心でしかもterraform使えるので管理が楽。他社VPSでもterraform使えるところありますが、あと一歩かゆいところに手が届かないのが多い印象です。

そんなアクセスないしちょっとサーバ展開を試してみたいなーって思ったらAWS Lightsailはアリだと思いますよ！