0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

railsとnginxとAWSとPostgreSQLのデータベース設計入門

Last updated at Posted at 2025-05-06

はじめがき

僕はrailsで作成したアプリをawsにデプロイしたいなと思いawsを触ったもののエラーにつまりまくり、挫折しまくりました。

そして何とかrailsアプリをawsにアップすることができました。

初心者ですので、間違っている箇所もたくさんあると思いますが、指摘していただけると勉強になります。

この記事が少しでも役に立つと思って記事を書きました。長くなったのですが、読んでいただけると幸いです。

1.ネットワーク設計

ネットワーク設計の全体像

スクリーンショット 2025-05-06 113242.png

NAT-ゲートウェイは必ずパブリックサブネットに配置する必要がある。プライベートサブネットに置いてもインターネットに出られない。

パブリックサブネットNAT-ゲートウェイはおいており、プライベートサブネットルートテーブルにNAT-ゲートウェイをひもづけている。

パブリックサブネットが複数ある場合は、NAT-ゲートウェイを置くパブリックサブネットはどちらでもよい。
両方に置いた方が高可用性が高い。

高可用性のために、パブリックサブネットとプライベートサブネットを異なるアベイラビリティゾーンに分散させるべきである。

やり方

①まずVPCを作成して、そこにパブリックサブネットプライベートサブネットを2つずつ作成する。

パブリックサブネットに紐づけるルートテーブルを作成する。

パブリックサブネットに紐づけるルートテーブルインターネットゲートウェイを作成して紐づける。

パブリックサブネットルートテーブルを紐づける。

NAT-ゲートウェイパブリックサブネット上に作成する。

プライベートサブネットに紐づけるルートテーブルを作成する。

プライベートサブネットに紐づけるルートテーブルnatゲートウェイを紐づける。

プライベートサブネットルートテーブルを紐づける

これが大体の流れである。

2.ロードバランサー設計

ロードバランサー設計の全体像

スクリーンショット 2025-05-06 122355.png

やり方

①ロードバランサーをさっき作ったVPC内に作り、さっき作ったパブリックサブネットを2つ配置する。

セキュリティグループインバウンドルールHTTP:80HTTPS:4430.0.0.0/0ですべての通信を許可する。

開発時は0.0.0.0/0はセキュアでないので、自分のIPアドレス/32にすべきである。

image.png

アウトバウンドルールはすべての通信を許可する。

リスナーHTTP:80HTTPS:443を設定する。

⑤リスナーのHTTP:80HTTPS:443にリダイレクトするようにする。

ターゲットグループHTTP:80と設定して、ヘルスチェックは/upとする。

⑦リスナーのHTTPS:443ターゲットグループをひもずける。

3.RDSの設計

RDSの全体像

スクリーンショット 2025-05-06 233253.png

やり方

データベースのタイプ:PostgreSQLを使う

データベースの認証情報管理:AWS Secrets Managerを使う。

パブリックアクセス:なし

VPC:今回のvpcを設定する

セキュリティグループ:データベースのセキュリティグループを作成する

データベースのセキュリティグループのインバウンドルール

image.png

データベースのセキュリティグループのアウトバウンドルール:すべてのトラフィックを許可

4.ECSの設定

ECSの全体像

スクリーンショット 2025-05-06 150951.png

やり方

①まずタスク定義を設定する。

②作ったVPCを設定する。

プライベートサブネットを2つひもづける。

railsセキュリティグループを作成する。

image.png
アウトバウンドルール:すべてのトラフィックを許可

nginxセキュリティグループを作成する。

image.png
アウトバウンドルール:すべてのトラフィックを許可

パブリックIPオフにする。

⑦作ったロードバランサーを設定する。

5.ECRの設計

ECRの全体像

スクリーンショット 2025-05-07 210225.png

やり方

ECRnginxrailsECRを作成する。
②それぞれの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
ログ収集:オン
環境変数

image.png

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を分ける場合は以下のように管理する:

image.png

config/master.keyはGITHUBやECRにpushするのは危険なので、.dockerignore.gitignoreconfig/master.keyのファイル名を記入することでpushされないように設定すべきである。

RDSのパスワード

RDSのパスワードはRDSが自動で作ってくれるため、作らなくてよい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?