🥅

[AWS]EC2とRDS,S3の接続をあえて手動で行う。

2024/09/23に公開

モチベーション

趣味の開発でEC2からテキスト(Markdown)をRDS(Postgres)で管理し、画像や動画などをS3で管理する構成を考えていました。RDSをEC2にワンポチで接続していたので今回は何が面倒なのか検証するためにあえて手動でやってみました。

そもそもS3を使ったことがなかったのですがこれは自動で接続できないのですね

EC2回り

ここからはEC2,RDS,S3を立ち上げた前提で話を進めます。
また、EC2の立ち上げ時にFirewallをこのようにしています。

EC2のダッシュボードからセキュリティグループに移動してこんな感じで設定します。

インバウンドルール(EC2への通信を許可するルール)

SSH (ポート22):
	•タイプ: SSH
	•プロトコル: TCP
	•ポート範囲: 22
	•送信元: 自分のIPアドレスのみ(My IPを選択)
HTTP (ポート80):
	•タイプ: HTTP
	•プロトコル: TCP
	•ポート範囲: 80
	•送信元: 0.0.0.0/0(全世界からのアクセスを許可)
HTTPS (ポート443):
	•タイプ: HTTPS
	•プロトコル: TCP
	•ポート範囲: 443
	•送信元: 0.0.0.0/0(全世界からのアクセスを許可)

アウトバウンドルール(EC2から外部への通信を許可するルール)

すべてのトラフィック:
    •タイプ: All Traffic
    •プロトコル: All
    •ポート範囲: All
    •送信先: 0.0.0.0/0

各ポートの役割について

1. ポート22(SSH)

•役割: EC2インスタンスに対してSSH(Secure Shell)接続を許可するためのポートです
•用途: SSHはリモートでサーバーに接続し、コマンドラインから操作するためのプロトコルで、EC2インスタンスにアクセスしてアプリケーションをデプロイしたり、設定を変更したりする際に必要になります。
•セキュリティの注意点:SSHポート(22番)は外部からアクセスされるリスクがあるため、セキュリティグループでは自分のIPアドレスだけにアクセスを制限することが推奨されます。また、鍵ベース認証を利用して、パスワードではなくSSHキーを使用してアクセスするのがベストプラクティスです。

2. ポート80(HTTP)

•役割: HTTPを使用して、Webブラウザや他のクライアントからEC2上のアプリケーションにアクセスするためのポートです。
•用途: HTTPは、Webサイトを表示する際に標準的に使用されるプロトコルです。例えば、EC2インスタンス上にWebサーバー(NGINX、Apacheなど)をホストしている場合、Webページのリクエストをこのポートで受け付けます。

3. ポート443(HTTPS)

•役割: HTTPSプロトコルを使用して、暗号化された通信を行うためのポートです。
•用途: HTTPSは、HTTPの通信にSSL/TLS暗号化を追加して、クライアント(ブラウザ)とサーバー間のデータを暗号化します。Webサイトのセキュリティを高め、データの盗聴や改ざんを防ぐために使われます。

RDS

RDSインスタンスにも、EC2からアクセスできるようにセキュリティグループを設定します。
立ち上げる際に以下のように設定しています。普段ならSelect excisting security groupを選択するのが無難でしょう。

インバウンドルール

PostgreSQL (ポート5432):
タイプ: PostgreSQL
プロトコル: TCP
ポート範囲: 5432
送信元: EC2インスタンスのセキュリティグループ

S3

S3はセキュリティグループを直接使用しませんが、バケットポリシーを設定してアクセスを制御します。
これはJSONファイルに設定を記述することで実現できます。
以下は、特定のEC2インスタンスからS3バケットへのアクセスを許可するポリシーです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "EC2のパブリックIP"
                }
            }
        }
    ]
}

各フィールドはこちらの記事を参照して設定しました。
https://qiita.com/irico/items/a3ab1f8ebf1ece9cc783

まとめ

S3のポリシー設定が少しめんどくさいなと思いました。
基本的に自動化できるところは自動化したほうが構築が楽ですし、セキュリティ面でもネットワークはベストプラクティスに従った方が良いと思います。

Discussion