Python
HTML
AWS
EC2
PostgreSQL

AWS EC2上にWEB2層システムを構築


要件


  • 事前にデータベースにデータを投入する事

  • httpのGETリクエストを受付け、データベースにSQL(select)を発行し結果をレスポンスするアプリケーションを作成する事

  • 上記を確認方法を明記する事


自己テーマ


  • 構築手順をCLI操作で完結させる。


サーバ名


  • TEST01


構成

Name
Version

OS
Linux
Amazon linux2

DB
PostgreSQL
9.2.23

APP
Python
3.6.4


備考


  • 構築手順は[Cloud9]もしくは[Amazon linux2]で作成したご自身のサーバから実施してください。

  • 手順上不必要な出力は省略してます。

  • 設定ファイルのバックアップは/home/ec2-user/配下に配置します。(暫定)

  • コマンド上編集が必要な箇所は<太文字>で記載してます。

  • 確認観点も太文字で記載してます。


要件確認手順


構築手順


1.AWS CLI設定

$ aws configure  

AWS Access Key ID :<アクセスキー>
AWS Secret Access Key []:<シークレットアクセスキー>
Default region name [us-east-1]:ap-northeast-1
Default output format [None]: json


2.jqコマンドインストール

$ sudo curl -o /usr/local/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 \  

&& sudo chmod +x /usr/local/bin/jq


3.キーペア作成

$ aws ec2 create-key-pair --region ap-northeast-1 --key-name <キーペア名> --query 'KeyMaterial' --output text > <キーペア名>.pem


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

$ aws ec2 create-security-group --region ap-northeast-1 --group-name <セキュリティグループ名> --description "<説明>"  

{
"GroupId": "sg-XXXXXXXX" ←<セキュリティグループID>
}


5.セキュリティグループにルール追加

$ aws ec2 authorize-security-group-ingress --region ap-northeast-1 --group-id <セキュリティグループID> --protocol tcp --port 22 --cidr 0.0.0.0/0  

$ aws ec2 authorize-security-group-ingress --region ap-northeast-1 --group-id <セキュリティグループID> --protocol tcp --port 8000 --cidr 0.0.0.0/0


6.ルールが追加された事を確認

$ aws ec2 describe-security-groups --region ap-northeast-1 --group-id <セキュリティグループID> | jq -r '.SecurityGroups[].IpPermissions[]'  

**以下確認観点**
**1. IpProtocolがtcpである事**
**2. FromPort,ToPort,CidrIPが[5.セキュリティグループにルール追加]の設定内容と同一である事**
 {
   "PrefixListIds": [],
   "FromPort": 8000,
   "IpRanges": [
   {
    "CidrIp": "0.0.0.0/0"
   }
  ],
  "ToPort": 8000,
  "IpProtocol": "tcp",
  "UserIdGroupPairs": [],
  "Ipv6Ranges": []
 }
 {
  "PrefixListIds": [],
  "FromPort": 22,
  "IpRanges": [
   {
   "CidrIp": "0.0.0.0/0"
  }
  ],
  "ToPort": 22,
  "IpProtocol": "tcp",
  "UserIdGroupPairs": [],
  "Ipv6Ranges": []
 }


7.インスタンス作成

$ aws ec2 run-instances --region ap-northeast-1 --image-id ami-c2680fa4 \  

--count 1 --instance-type t2.micro --key-name <キーペア名> \
--security-group-ids <セキュリティグループID> | tee <インスタンス名>.json |jq -r '.Instances[0].InstanceId'\
| xargs -IINSTANCE_ID aws ec2 create-tags --region ap-northeast-1 --resources INSTANCE_ID --tags Key=Name,Value=<インスタンス名>


8.パブリック DNS (IPv4)確認

$ aws ec2 describe-instances --region ap-northeast-1 --filters "Name=tag-value,Values=<インスタンス名>" |jq -r '.Reservations[].Instances[].PublicDnsName'  

**表示されたパブリックDNSを控えてください。**
ecX-XX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com ←<パブリックDNS>


9.インスタンス接続

$ sudo ssh -i <キーペア名>.pem ec2-user@<パブリック DNS (IPv4)>

Are you sure you want to continue connecting (yes/no)? yes


10.タイムゾーン変更

$ timedatectl  

[Time zone]が[Asia/Tokyo]ではない事を確認
Time zone: UTC (UTC, +0000)

$ sudo timedatectl set-timezone Asia/Tokyo  

$ timedatectl
[Time zone]が[Asia/Tokyo]である事を確認
Time zone: Asia/Tokyo (JST, +0900)


11.PostgresSQLインストール

$ sudo yum update -y  

$ sudo yum install -y postgresql postgresql-server postgresql-devel postgresql-contrib postgresql-docs
$ psql --version
psql (PostgreSQL) 9.2.23


12.PostgresSQL初期設定

$ sudo /sbin/service postgresql initdb


13.PostgresSQL起動及び自動起動設定

$ sudo /sbin/service postgresql start  

$ sudo /sbin/chkconfig postgresql on


14.postgresユーザパスワード設定

$ sudo passwd postgres

Changing password for user postgres.
New password:<パスワード>
Retype new password:<パスワード>
passwd: all authentication tokens updated successfully.


15.認証設定変更

**この手順を実施しなかった場合、DB接続時の認証が失敗します。**  

$ sudo ls -l /var/lib/pgsql/data/pg_hba.conf
対象ファイルが存在する事を確認
-rw------- 1 postgres postgres 4232 Apr 10 23:23 /var/lib/pgsql/data/pg_hba.conf

$ sudo cp -p /var/lib/pgsql/data/pg_hba.conf /home/ec2-user/pg_hba.conf_bk
$ sudo ls -l /var/lib/pgsql/data/pg_hba.conf /home/ec2-user/pg_hba.conf_bk
[/home/ec2-user/pg_hba.conf_bk]が[/var/lib/pgsql/data/pg_hba.conf]と同様の権限で生成された事を確認
-rw------- 1 postgres postgres 4232 Apr 10 23:23 /home/ec2-user/pg_hba.conf_bk
-rw------- 1 postgres postgres 4232 Apr 10 23:23 /var/lib/pgsql/data/pg_hba.conf

$ sudo vi /var/lib/pgsql/data/pg_hba.conf
# IPv4 local connections:
host   all    all    127.0.0.1/32    trust ←**identから変更**


16.postgresqlサービス再起動

$ sudo /sbin/service postgresql restart


17.DB作成

$ su - postgres

Password:<パスワード>

-bash-4.2$ createdb DB_BOOWY
-bash-4.2$ psql DB_BOOWY


18.テーブル作成

TableName=# create table TABLE_BOOWY (

NAME char(20),
AGE serial,
JOB char(10)
);


19.キー作成

TableName=# insert into TABLE_BOOWY values ('HimuroKyousuke', 57,'Vocal');  

TableName=# insert into TABLE_BOOWY values ('HoteiTomoyasu', 56,'Guitar');
TableName=# insert into TABLE_BOOWY values ('MatuiTunematu', 57,'Base');
TableName=# insert into TABLE_BOOWY values ('TakahashiMakoto', 64,'Drum');


20.テーブル確認

TableName=# select * from TABLE_BOOWY;  

以下の様に出力される事を確認
name     |age|job
------------------------+--+------------
HimuroKyousuke|57|Vocal
HoteiTomoyasu |56|Guitar
MatuiTunematu |57|Base
TakahashiMakoto|64|Drum
(4 rows)

TableName=# \q
-bash-4.2$ exit


21.Python3インストール

$ sudo yum -y install gcc zlib-devel bzip2-devel openssl-devel readline-devel  

$ wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
$ tar xvzf Python-3.6.4.tgz
$ cd Python-3.6.4
$ ./configure --prefix=/opt/python3.6.4
$ make
$ sudo make install


22.Python3がインストルールされた事を確認

$ /opt/python3.6.4/bin/python3 -V  

バージョンが出力される事を確認
Python 3.6.4


23.psycopg2インストール

$ sudo /opt/python3.6.4/bin/python3 -m pip install psycopg2 psycopg2-binary  


24.http.server起動

$ cd;pwd  

/home/ec2-user

$ mkdir -p web
$ cd web/
$ echo `"<html><body>test</body><html>"` > index.html
$ /opt/python3.6.4/bin/python3 -m http.server --cgi &
**ENTERを押下**
$ netstat -anp --tcp |grep python3
**ポート8000が出力される事を確認**
tcp 0 0 0.0.0.0:`8000 `0.0.0.0:* LISTEN 28245/python3


25.疎通確認

$ curl http://<パブリック DNS (IPv4)>:8000

**以下の様に出力される事を確認**
<html><body>test</body><html>


26.pythonコーディング

$ cd;pwd  

/home/ec2-user

$ mkdir -p web/cgi-bin/
$ vi web/cgi-bin/index.py
$ chmod 755 web/cgi-bin/index.py


27.疎通確認

$ curl http://`<パブリック DNS (IPv4)>`:8000/cgi-bin/index.py  

**以下の様に出力される事を確認**
<html>
<body>

HimuroKyousuke 57 Vocal
<br />
HoteiTomoyasu 56 Guitar
<br />
MatuiTunematu 57 Base
<br />
TakahashiMakoto 64 Drum
<br />

</body>
</html>