[スクショ付き]AWSにVPCを構築し、EC2を立てる(Flaskで簡単なWebサービスを作ってみる[第4回])

2020年9月2日

はじめに

PythonのWebアプリケーションフレームワークFlaskを使って、「消耗品買い物リスト」を作ってみます。
今回はAWSに本番環境を構築していきます。

前回まで

今回やること

AWSでVPCを作成し、EC2を起動して、Dockerをインストールして、リポジトリをプルして、本番環境をデプロイするところまでをやっていきたいのですが、本記事では作業ユーザーの作成までです。

  • 構成図
  • VPCセットアップ
  • EC2起動
  • 作業ユーザー作成 ← 本記事はここまで
  • Gitインストール
  • Dockerインストール
  • Flaskの起動・動作確認

構成図

システム構成はこんな感じにします。とりあえず動かす最小構成。

VPCセットアップ

まずはVPCを作ります。

  • AWSマネジメントコンソール > サービス > VPC
  • VPCウィザードの起動

ステップ 1: VPC 設定の選択

「選択」をクリック

ステップ2: 1 個のパブリックサブネットを持つ VPC

  • 基本デフォルトで
    • IPv4 CIDRブロック: 10.0.0.0/16 (デフォルト)
    • IPv6 CIDR ブロック: IPv6 CIDR ブロックなし (デフォルト)
  • 任意入力
    • VPC名: to-buy-list
    • アベイラビリティゾーン: ap-northeast-1a
    • サブネット名: to-buy-list-subnet
  • DNSホスト名を有効化: はい 

VPCが正常に作成されました

一瞬で作成されます。
「OK」を押すとVPCのダッシュボードが表示され、先程作成したVPCが確認できます。

自動的に以下も作成されます。便利…

  • IGW
  • ルートテーブル
  • サブネット

ルートテーブルとIGWのNameタグを設定しておく

特にやらなくてもいいかもしれませんが、リソースが増えてきたときにわかりやすいように名前をつけておきます。

  • ルートテーブル
    • VPC > ルートテーブル
    • VPC IDがさきほど作ったもののNameを編集
  • IGW
    • VPC > インターネットゲートウェイ
    • VPC IDがさきほど作ったもののNameを編集

セキュリティグループの設定

セキュリティグループを作成しておきます。
最低限のセキュリティ設定をします。基本は必要なものだけ通す、です。

セキュリティグループの作成

VPC > セキュリティグループ > セキュリティグループを作成

  • セキュリティグループ名
    • 作成後に名前を編集することはできません。 とのことなので注意。
  • 説明: (任意)
  • VPC: 作成したVPCを選択

インバウンドルール

VPC内のインスタンスに、自分の開発環境のネットワーク以外からはアクセスできないようにしておきます。

具体的にはSSH/HTTP/HTTPSのポートに対し、マイIPからのみ接続できるようにします。

  • インバウンドルールを追加
  • SSH接続
    • タイプ: SSH
    • ソース: マイIP
  • 同じ要領で、HTTP/HTTPS接続もそれぞれ追加します
  • HTTP接続
    • タイプ: HTTP
  • HTTPS接続
    • タイプ: HTTPS
  • マイIPを選択すると、使っているIPアドレスが表示されます
  • その他、IP接続を許可したいIPアドレスがあれば同様の手順で追加しておきます

アウトバウンドルール、Tagsはスルーして「セキュリティグループを作成」。

こんな感じになります。

EC2起動

EC2を立ち上げます。

サービス > EC2 > インスタンス

「インスタンスの作成」をクリック

ステップ 1: Amazon マシンイメージ (AMI)

好きなAMIを選びましょう。
今回は「Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type」を選択します。
「レポジトリには、Docker、PHP、MySQL、PostgreSQL、およびその他のパッケージが含まれます。」という記載があり、追加インストールの手間が省けそうなので。

ステップ 2: インスタンスタイプの選択

インスタンスタイプを選択します。
とりあえず動かすだけなので最小限のスペックで。
「t2.micro」を選択し、「次のステップ」をクリック。

ステップ 3: インスタンスの詳細の設定

色々設定できますが、基本デフォルトで。以下のところは設定します。

  • ネットワーク: 作成したVPCを選択
  • 自動割り当てパブリックIP: 有効
    • EC2を起動するたびにパブリックIPを割り当てるようにします。

「次のステップ」をクリック

ステップ 4: ストレージの追加

EBSを追加します。
サイズ(GB)などは必要に応じて変更します。
今回はデフォルトでそのまま進めます。

「次のステップ」をクリック

ステップ 5: タグの追加

作成するインスタンスにわかりやすい名前をつけておきます。

  • タグの追加
  • キー: Name
  • 値: to-buy-list-web
  • インスタンス/ボリュームにそれぞれチェック(デフォルト)

「次のステップ」をクリック

ステップ 6: セキュリティグループの設定

  • セキュリティグループの割り当て: 既存のセキュリティグループを選択する
  • さきほど作成したセキュリティグループを選択
  • 内容を確認し、「確認と作成」

ステップ 7: インスタンス作成の確認

設定内容を確認し、「起動」

キーペアの設定

  • 新しいキーペアの作成
  • キーペア名を入力
  • ダウンロード
  • XXX.pemというファイルが無事ダウンロードされたことを確認して、「インスタンスの作成」

「インスタンスは現在作成中です」と出て、作成されるまでしばらく待ちます。

「インスタンスを表示」をクリックするとインスタンス一覧の画面に遷移し、作成したインスタンスのステータスが確認できます。

EC2にSSH接続

EC2が起動したら、SSH接続して諸々の作業をすすめていきます。

IPアドレスを確認

  • インスタンスの画面で、起動したインスタンスを選択
  • 画面下部「説明」タブ > IPv4 パブリック IPの値をコピーしておきます。

ターミナル作業

ここからはターミナルの作業になります。

鍵ファイルを~/.ssh/配下に移動しておき、その上でsshコマンドでSSH接続を試みます。

$ mv Downloads/xxx.pem ~/.ssh/
$ ssh -i ~/.ssh/xxx.pem ec2-user@[さきほどコピーしたIPアドレス]

よくあるエラー

The authenticity of host 'XXX' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'XXX' (ECDSA) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'XXX.XXX.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/xxx/.ssh/xxx.pem": bad permissions
ec2-user@xx.xxx.xx.xx: Permission denied (publickey).

上記のようなエラーが出た場合、xxx.pemファイルのパーミッションがゆるいので、

$ chmod 600 ~/.ssh/xxx.pem

とでもしておきましょう

SSH接続に成功すると以下のようになります

~ $ ssh -i ~/.ssh/xxx.pem ec2-user@xx.xxx.xx.xx                    

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
6 package(s) needed for security, out of 10 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-86 ~]$ 

各種設定

yumのupdate

$ sudo yum -y update

タイムゾーン設定

$ sudo vi /etc/sysconfig/clock

ZONE="UTC"
UTC=true

# 以下に書き換え
ZONE="Asia/Tokyo"
UTC=false

作業ユーザーの作成

$ sudo useradd oshiro
$ sudo passwd oshiro
$ sudo visudo

oshiro  ALL=(ALL)       NOPASSWD: ALL

ユーザーをグループに追加

$ sudo usermod -aG wheel oshiro

# 確認
$ groups oshiro
oshiro : oshiro wheel

ssh設定をコピー

# コピー
$ sudo rsync -avz ~/.ssh/authorized_keys /home/oshiro/.ssh/

# コピーしたディレクトリの所有者変更
$ sudo chown -R oshiro:oshiro /home/oshiro/.ssh

# 確認
$ ls -la /home/oshiro/ | grep ssh

drwxr-xr-x 2 oshiro oshiro 4096  8月 28 17:00 .ssh

別のターミナルから作成したユーザーでログインできることを確認

$ ssh -i ~/.ssh/xxx.pem oshiro@[IPアドレス]

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[oshiro@ip-10-0-0-86 ~]$

これでEC2の準備ができました。

終わりに

EC2を起動し、作業ユーザーを作成しました。
次回以降、Dockerを入れて動かしてみます。

参考