はじめがき
僕はrailsで作成したアプリをawsにデプロイしたいなと思いawsを触ったもののエラーにつまりまくり、挫折しまくりました。
そして何とかrailsアプリをawsにアップすることができました。
初心者ですので、間違っている箇所もたくさんあると思いますが、指摘していただけると勉強になります。
この記事が少しでも役に立つと思って記事を書きました。長くなったのですが、読んでいただけると幸いです。
1.ネットワーク設計
ネットワーク設計の全体像
NAT-ゲートウェイは必ずパブリックサブネットに配置する必要がある。プライベートサブネットに置いてもインターネットに出られない。
パブリックサブネットにNAT-ゲートウェイはおいており、プライベートサブネットのルートテーブルにNAT-ゲートウェイをひもづけている。
パブリックサブネットが複数ある場合は、NAT-ゲートウェイを置くパブリックサブネットはどちらでもよい。
両方に置いた方が高可用性が高い。
高可用性のために、パブリックサブネットとプライベートサブネットを異なるアベイラビリティゾーンに分散させるべきである。
やり方
①まずVPCを作成して、そこにパブリックサブネットとプライベートサブネットを2つずつ作成する。
②パブリックサブネットに紐づけるルートテーブルを作成する。
③パブリックサブネットに紐づけるルートテーブルにインターネットゲートウェイを作成して紐づける。
④パブリックサブネットにルートテーブルを紐づける。
⑤NAT-ゲートウェイをパブリックサブネット上に作成する。
⑥プライベートサブネットに紐づけるルートテーブルを作成する。
⑦プライベートサブネットに紐づけるルートテーブルにnatゲートウェイを紐づける。
⑧プライベートサブネットにルートテーブルを紐づける
これが大体の流れである。
2.ロードバランサー設計
ロードバランサー設計の全体像
やり方
①ロードバランサーをさっき作ったVPC内に作り、さっき作ったパブリックサブネットを2つ配置する。
②セキュリティグループのインバウンドルールはHTTP:80とHTTPS:443を0.0.0.0/0ですべての通信を許可する。
開発時は0.0.0.0/0はセキュアでないので、自分のIPアドレス/32にすべきである。
③アウトバウンドルールはすべての通信を許可する。
④リスナーはHTTP:80とHTTPS:443を設定する。
⑤リスナーのHTTP:80はHTTPS:443にリダイレクトするようにする。
⑥ターゲットグループはHTTP:80と設定して、ヘルスチェックは/upとする。
⑦リスナーのHTTPS:443にターゲットグループをひもずける。
3.RDSの設計
RDSの全体像
やり方
データベースのタイプ:PostgreSQLを使う
データベースの認証情報管理:AWS Secrets Managerを使う。
パブリックアクセス:なし
VPC:今回のvpcを設定する
セキュリティグループ:データベースのセキュリティグループを作成する
データベースのセキュリティグループのインバウンドルール:
データベースのセキュリティグループのアウトバウンドルール:すべてのトラフィックを許可
4.ECSの設定
ECSの全体像
やり方
①まずタスク定義を設定する。
②作ったVPCを設定する。
③プライベートサブネットを2つひもづける。
④railsのセキュリティグループを作成する。
⑤nginxのセキュリティグループを作成する。
⑥パブリックIPをオフにする。
⑦作ったロードバランサーを設定する。
5.ECRの設計
ECRの全体像
やり方
①ECRにnginxとrailsのECRを作成する。
②それぞれのECRにコードをプッシュする。
6.Task定義の設計
Task定義の概要
起動タイプ:AWS Fargate
オペレーティングシステム/アーキテクチャ:Linux/X86_64
タスクサイズ:CPU:.5 v メモリ:1 GB
タスクロール:secretsmanager:GetSecretValue アクションを実行できるタスクロールを選択する
railsのマスターキーやRDS(PostgreSQL)のパスワードを取得するため
タスクロールにこのポリシーをくっつける
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": [
"RDSのパスワードを保存しているAWS Secrets Manager
のシークレットの ARN",
"railsのマスターキーを保存しているAWS Secrets Manager
のシークレットの ARN"
]
}
]
}
nginxのTask定義
必須コンテナ:はい
ポートマッピング:HTTP:80
ログ収集:オン
railsのTask定義
必須コンテナ:はい
ポートマッピング:TCP:3000
ログ収集:オン
環境変数:
7.Secrets Managerの設計
Secrets Managerの概要
Secrets ManagerにはrailsのマスターキーとRDSのパスワードを保存する。
railsのマスターキー
railsのマスターキーは開発環境の場合(RAILS_ENV=development)は、config/master.keyの中にあるため、その値をSecrets Managerに保存する。
Railsアプリの設定ファイル(config/credentials.yml.encなど)は暗号化されており、これを復号するための鍵がconfig/master.keyである。
環境ごとにcredentialsを分ける場合は以下のように管理する:
config/master.keyはGITHUBやECRにpushするのは危険なので、.dockerignoreと.gitignoreにconfig/master.keyのファイル名を記入することでpushされないように設定すべきである。
RDSのパスワード
RDSのパスワードはRDSが自動で作ってくれるため、作らなくてよい。
8.S3の設計
S3の概要
S3を作成し、RailsアプリがS3にアクセスできるようにするには、S3アクセス権限を持つポリシーをタスクロールにアタッチする。
S3の作り方
| 設定項目 | 内容 |
|---|---|
| バケットタイプ | 汎用 |
| バケット名 | 好きな名前(例:tech-books-circle-bucket) |
| オブジェクト所有者 | ACL 無効(推奨) |
| パブリックアクセスのブロック | すべてブロックにチェック |
| バージョニング | 無効にする |
| デフォルトの暗号化 | Amazon S3 マネージドキー(SSE-S3) |
| バケットキー | (SSE-KMSを使うときのみ有効) |
タスクロールの設定のやり方
① IAM → 「ポリシー」 → 「ポリシーを作成」
② 「JSON」タブを開き、以下を入力:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::ここに自分が決めたS3のバケット名を書く/*"
}
]
}
③ 適切なポリシー名をつけて作成する。
④ 作成したポリシーを、Railsアプリ用のタスク定義で使っているタスクロールにアタッチする。
これにより、RailsアプリがS3バケットにアクセスできるようになる。










