3
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?

More than 1 year has passed since last update.

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

3
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:80とHTTPS:443を0.0.0.0/0ですべての通信を許可する。

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

image.png

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

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

⑤リスナーのHTTP:80はHTTPS: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

やり方

①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
ログ収集:オン
環境変数:

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と.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バケットにアクセスできるようになる。

3
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
3
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?