はじめがき
僕は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が自動で作ってくれるため、作らなくてよい。