はじめがき
僕は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バケット
にアクセスできるようになる。