LoginSignup
6
3

More than 3 years have passed since last update.

ECS・RDSを使って初めてのAWS環境構築をしてみた

Last updated at Posted at 2020-12-13

はじめに

2020の11月に開催されたJPHACKS2020に参加し、本戦に進むことができました!
その際、以前から興味があったAWS (Amazon Web Service)を初めて使ってインフラ環境の構築をしたので、その設計についての記事を書こうと思います。

開発したサービスについて

開発したサービスは「Effective Work」という名前です。
(サービスの紹介動画はこちら

ハッカソンのテーマが「〇〇 × Tech」だったので、僕たちは「Tele × Tech」というテーマを軸にサービスを考えました。
サービスの内容を簡単に説明すると、ユーザーが座っている椅子につけられたセンサーのデータを元にリモートワーク中の集中力を測定し、集中力のレコードをブラウザ上で確認できたり、集中力が下がった・下がりそうなユーザーにSlackで通知をして休憩を促す、といったものです。それにより、集中力が下がる前に適切な休憩取り、仕事時間全体として高い生産性を保ってもらうことを目的としています。

前提条件

  • aws cliのインストール済
  • dockerのインストール済
  • AWSについての基本的な知識
  • ネットワークについての基本的な知識

サービスの全体構造

先頭で書いたとおり、今回はAWSの各種サービスを使ってインフラ環境を構築しました。全体的な構成は以下のようになっています。
effective_work_architecture.png
バックエンドのAPIサーバーにはECS (Elastic Container Service)を使い、データベースとしてRDS (Relational Database Service)でPostgreSQLを使用しました。
フロントエンドはReactで開発したソースコードをbuildして静的ファイルを生成し、それをS3 (Simple Storage Service)に置いて配信しています。

この記事では、バックエンド部分のECSRDSについての設計について説明します。(その他のサービスについては別の記事で書く予定です。)

VPC

VPCの作成

まずはVPC (Virtual Private Cloud)の作成をします。
VPCはAWSの一番基本となるサービスで、ユーザー専用のネットワーク環境を構築することができます。
今回はCIDRを "10.0.0.0/16" にして "effective-work-vpc" という名前で作りました。
スクリーンショット 2020-12-12 16.36.23.png

サブネットの作成

続いてサブネットの作成です。サブネットは先程作成したVPCのネットワークをさらに細かく分ける機能で、今回はインターネットに接続するパブリックサブネットとインターネットに接続しないプライベートサブネットを、2つのAZ (アベイラビリティーゾーン)にそれぞれ1つずつ作成しました。

  • effective-work-subnet-public-a(10.0.1.0/24)
  • effective-work-subnet-public-c(10.0.2.0/24)
  • effective-work-subnet-private-a(10.0.10.0/24)
  • effective-work-subnet-private-c(10.0.20.0/24)

スクリーンショット 2020-12-12 16.41.24.png

ルートテーブルの関連付け

ここで、作成したパブリックサブネットがインターネットに接続できるように、インターネットゲートウェイをデフォルトゲートウェイに登録したルートテーブルをサブネットに関連付ける必要があります。

まず、新たにインターネットゲートウェイ "effective-work-internet-gateway" を作成し、先ほど作成したVPCにアタッチします。
スクリーンショット 2020-12-12 16.56.03.png
スクリーンショット 2020-12-12 16.56.31.png

次に、新たにルートテーブル "effective-work-route-table-public" を作成し先程のインターネットゲートウェイをデフォルトゲートウェイとして登録しておきます。
スクリーンショット 2020-12-12 16.58.36.png
スクリーンショット 2020-12-12 16.59.37.png

そして、作成したルートテーブルを先ほど作成した2つのパブリックサブネットに関連付けます。
スクリーンショット 2020-12-12 17.24.11.png
スクリーンショット 2020-12-12 17.24.26.png

これで、VPCの設定はとりあえず終了です。続いてRDSの設定に移りましょう。

RDS

参考:Dockerコンテナで作ったアプリをECS+RDSでデプロイする

上記の記事を参考にしてRDSのインスタンスを作成しました。

DBサブネットグループの作成

まずはRDSのマネジメントコンソールを開き、サブネットグループのページを開きます。そして、新たに"effective-work-subnet-group"という名前のサブネットグループを作成します。
VPCのコンソール画面でなく、RDSのコンソール画面のサブネットグループなので注意!
スクリーンショット 2020-12-12 17.33.26.png

ここで、AZは先ほど作成したVPCのサブネットを配置した "ap-northeast-1a" と "ap-northeast-1c" を選び、VPCのサブネットは先ほど作成した2つのプライベートサブネットを指定します。
スクリーンショット 2020-12-12 17.29.27.png

RDSインスタンスの作成

続いて、RDSインスタンスを作成していきます。今回はにPostgreSQLを選択しました。
スクリーンショット 2020-12-12 17.42.36.png
スクリーンショット 2020-12-12 17.42.50.png
スクリーンショット 2020-12-12 17.43.12.png
スクリーンショット 2020-12-12 17.44.35.png

VPCは先ほど作成したものを選択します。サブネットグループも同様です。また、セキュリティグループは新たに "effective-work-security-group" という名前のものを作成しました。
スクリーンショット 2020-12-12 17.46.47.png

また、Additional configurationの欄を開いて任意の初期データベース名を設定しましょう。
スクリーンショット 2020-12-12 20.38.27.png

DBインスタンスを作成するとこのような表示が画面上部に出てくるので、 "View credential details" を押してパスワードを忘れずに記録しておきましょう。(自分で決めたパスワードを設定した場合はそれを覚えておけば大丈夫です。)
スクリーンショット 2020-12-12 17.50.07.png

最後に、作成したDBインスタンスのエンドポイントをメモしておきます。インスタンス詳細画面の "Connectivity & security" 欄に記載してあるので、先ほど設定した「管理者ユーザー名」「管理者ユーザーパスワード」「初期データベース名」と合わせて保管しておきましょう。これらの情報は他人には絶対に知られないように大切に保管してください。
image.png

ECS

IAMユーザーの作成

最後に、ECSの設定をします。
まず初めに、コマンドラインからECRにアクセスできるように、ECRにアクセスする権限を持つIAM(Identitity and Access Management)ユーザーを作成します。

  1. IAMのコンソール画面から「ユーザー」欄を開き、「ユーザーの追加」をクリックする。
  2. 任意のユーザー名を入力し、「プログラムによるアクセス」にだけチェックを付けて次へ進む。
  3. 「既存のポリシーを直接アタッチ」を選択し、「AmazonEC2ContainerRegistryFullAccess」にチェックを入れて次に進む。
  4. タグを追加したければ追加し、最後に確認へ進み、「ユーザーの作成」をクリックする。
  5. 表示される認証情報「アクセスキーID」と「シークレットアクセスキー」をメモしておく。

IAMユーザーの作成が終わったら、ローカル環境にあるPCのコマンドラインでaws configureを実行し、アクセスキーやシークレットアクセスキーの入力を求められるので先ほどメモしたものを入力します。

クラスターの作成

ECSのコンソール画面から「クラスター」を選択し、クラスターの作成をクリックします。
クラスターの主要項目の設定例を下記に示しておきます。

【クラスターテンプレート】 EC2 Linux + ネットワーキング
【クラスター名】 任意(今回は "effective-work-cluster" に設定)
【EC2 インスタンスタイプ】 tc.micro
【インスタンス数】 1
【キーペア】 あらかじめ作成しておいたものを選択
【VPC】 先ほど作成した "effective-work-vpc"
【サブネット】 先ほど作成した2つのパブリックサブネット
【Auto assign public IP】 SSH接続をしてインスタンスの状態を確認したいためEnable(有効)にする
【セキュリティグループ】 新しいセキュリティグループを作成
【セキュリティグループのインバウンドルール】 ローカルのPCからSSH接続をしたいためCIDRブロックを0.0.0.0/0にし、ポート22を指定。(HTTPのインバウンドルールは後ほど設定する。)
【コンテナインスタンスのIAMロール】 ecsInstanceRole

これでクラスターの作成は完了です。

ECRの作成 & イメージのプッシュ

続いてAWS上のコンテナイメージ置き場であるECR (Elastic Container Repository)の設定をします。ECSのコンソール画面からECRの欄を開き、新規リポジトリを作成します。
作成すると下記のようなポップアップが出てくるので、「プッシュコマンドの表示」をクリックして書いてある通りに操作を行い、リポジトリにdockerイメージをプッシュします。
スクリーンショット 2020-12-12 21.42.12.png
スクリーンショット 2020-12-13 13.46.37.png

タスク定義の作成

続いてタスク定義を行います。
ECSのコンソール画面からタスク定義を選択し、「新しいタスク定義の作成」をクリックします。
タスク定義の主要項目の設定例を下記に示しておきます。
【起動タイプの互換性】 EC2
【タスク定義名】 任意(今回は "effective-work-task" )
【タスクロール】 なし
【ネットワークモード】 awsvpc
【タスクの実行ロール】 ecsTaskExecutionRole
【コンテナの定義】
 【コンテナ名】 任意(今回は "effective-work-container" )
 【イメージ】 先ほどアップロードしたイメージのURIを記入する。
 【ハード制限】 128
 【ポートマッピング】 80, tcp
 【環境変数】 Flaskでデータベースに接続するので、RDSのセクションでメモしておいた「ホスト名」「データベース名」「管理者ユーザー名」「パスワード」を設定しておく。

サービスの作成

続いてサービスの作成をします。
先ほど作成したクラスターの詳細を開き、サービスの作成をクリックします。
スクリーンショット 2020-12-13 14.14.12.png
サービスの主要項目の設定例を下記に示しておきます。
【機動タイプ】 EC2
【タスク定義】 先ほど作成したタスク定義
【クラスター】 先ほど作成したクラスター
【サービス名】 任意(今回は "effective-work-service" )
【タスクの数】 1
【クラスターVPC】 先ほど作成したVPC
【サブネット】 先ほど作成した2つのパブリックサブネット
【ロードバランシング】 あらかじめ作成しておいたALB選択(ALBの作成についてはまた別に記事を書きます。)

これで、しばらくしたらコンテナインスタンスが立ち上がり、ALBのDNS名でサービスにアクセスできるようになります。

さいごに

今回は使ったサービスの中からECSとRDSについてのみ紹介しましたが、他にもS3やRoute53を使って独自ドメインで静的ファイルを配信したり、CircleCIを使って自動CI/CDを設定したりしたので、それらについての記事も書こうと思っています。

最後まで読んでいただきありがとうございました。

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