Vapor Trail

明るく楽しく元気よく

手を動かしながら2週間で学ぶ AWS 基本から応用まで Day3 Day4

Day3 AWSにおけるネットワーク

f:id:kyamashiro:20190105141347p:plain

1. VPCの作成

「1個のパブリックサブネットを持つ VPC」を選択
IPv4 CIDR ブロック:デフォルト
IPv6 CIDR ブロック:なし
VPC名を入力 public-subnet-1a パブリックサブネットの IPv4 CIDR:10.0.11.0/24
アベイラビリティーゾーン:ap-northeast-1a
VPCの作成

2. サブネットの追加

サブネットの作成
名前タグ:public-subnet-1c
VPC:今作ったやつを選択
アベイラビリティーゾーン:ap-northeast-1c
IPv4 CIDR ブロック:10.0.12.0/24
作成する
ルートテーブルでインターネットゲートウェイの設定がないので、1aのルーティングテーブルと同じものにする
ルートテーブル→変更→保存

3. パブリックサブネット上でEC2インスタンスを起動する

EC2インスタンスを作成→インスタンスの詳細の設定 ネットワーク:作成したVPCを選択 サブネット:1aを選択 自動割当パブリックIP:有効化 セキュリティグループ:HTTPを追加

4. インスタンスApache,PHPをインストールする

sudo vim /etc/sysconfig/network
//HOSTNAME=localhost.localdomainを変更
sudo vim /etc/hosts
//127.0.0.1 に今変更したHOSTNAMEを追加

言語設定

sudo vim /etc/sysconfig/i18n
LANG=ja_JP.UTF-8

時刻設定

sudo cp /usr/share/zoneinfo/Japan /etc/localtime
sudo vim /etc/sysconfig/clock
//ZONE="Asis/Tokyo"に変更

再起動

sudo reboot

インストール

sudo yum update
sudo yum install -y httpd24
sudo yum install -y php70 php70-mbstring php70-pdo php70-mysqlnd
sudo yum install -y mysql
sudo yum install -y git

Apacheの設定

sudo vim /etc/httpd/conf/httpd.conf

//index.phpを追加
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

//ServerNameを変更
ServerName www.example.com:80

//configntest
sudo /etc/init.d/httpd configtest

//Apache 自動起動設定
sudo chkconfig httpd on

PHPの設定

sudo vim /etc/php.ini

//Dynamic Extension
extension=mbstring

//mbstring.language
mbstring.language = Japanese
//mbstring.internal_encoding
mbstring.internal_encoding = UTF-8

サンプルプログラムを動かす

git clone https://github.com/ketancho/udemy-aws-14days.git
//Day3をコピー
sudo cp index.php /var/www/html
sudo cp -r img /var/www/html

作成したEC2インスタンスIPアドレスにアクセス

f:id:kyamashiro:20190105141352p:plain

Day4 AWSにおけるネットワーク

1. プライベートサブネットの構築

VPC→サブネットの作成
名前タグ:private-subnet-1a
VPC:作ったやつ
アベイラビリティーゾーン:ap-northeast-1a
IPv4 CIDR ブロック: 10.0.21.0/24

名前タグ:private-subnet-1c
VPC:作ったやつ
アベイラビリティーゾーン:ap-northeast-1c
IPv4 CIDR ブロック: 10.0.22.0/24

ルートテーブル作成 名前タグ入力→VPCを選択

Public VPC内の通信はローカルで処理 それ以外はインターネットゲートウェイに流す

2. プライベートサブネットにDBサーバ用EC2インスタンスを用意する

セキュリティグループで接続を制限する
EC2→セキュリティグループ→アクション→セキュリティグループのコピー
セキュリティグループ名:web-sg
作成
EC2インスタンスのセキュリティグループを作成したものに変更

DB EC2インスタンスを作成する
ネットワーク:作成しているvpc
サブネット:private-subnet-1a
自動割り当てパブリック IP:無効化
高度な詳細

#!/bin/bash

# ホスト名
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=udemy-aws-14days-db-1a/g' /etc/sysconfig/network
hostname 'udemy-aws-14days-db-1a'

# タイムゾーン
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock

# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n

セキュリティグループの設定
セキュリティグループ名:DB-sg
ルールの追加:MYSQL
SSH/MYSQLのソースを作成したセキュリティグループweb-sgに変更
SSH,MySQLへの接続はweb-sgがついているEC2インスタンスからの接続のみ可能にする
f:id:kyamashiro:20190105141357p:plain DBインスタンスはWebインスタンスを踏み台にして接続するので、秘密鍵をWebインスタンスへ送る

pemファイルがあるディレクトリに移動
scp -i key-pair.pem key-pair.pem ec2-user@x.x.x.x:/home/ec2-user/

Web-1aに入った状態で,DB-1aに接続する

ssh -i key-pair.pem ec2-user@x.x.x.x

3. NATゲートウェイの設定

VPC→サブネット
public-subnet-1aのサブネットIDをコピー
NATゲートウェイの作成
サブネット:public-subnet-1aのID
新しいEIPの作成
ルートテーブルの編集
privateのルートテーブル→追加
送信先:0.0.0.0/0 ターゲット:NATゲートウェイ

publicはインターネットゲートウェイ
privateはNATゲートウェイ

DB-1aインスタンスyumコマンドが使えるようになる

mysqlのインストール

sudo yum install -y mysql57-server
sudo chkconfig mysqld on
sudo service mysqld start
mysqladmin -u root password
mysql -u root -p
//DB-1aを抜けてWeb-1aからmysqlに接続
exit
mysql -h x.x.x.x -u root -p

PDOでDBへ接続できるようになる。

ネットワーク関連の設計ポイント
異なるシステムはアカウント単位で切る。
同一システムの各環境をアカウント・VPC単位で分けるかは状況による。

去年の反省と目標

2018年を振り返る

1月 就職活動
2月 プログラマーとして働き始める。
3月 ぼちぼち働く
4月 ぼちぼち働く
5月 ぼちぼち働く
6月 ぼちぼち働く
7月 ぼちぼち働く
8月 雲行きが怪しくなり始める。残業が多くなる。
9月 炎上
10月 炎上
11月 炎上
12月 一段落

前半

去年の2月に就職が決まってプログラマーとして働き始めたので、転職したという点で大きな変化があった1年だなと思う。 職業訓練校ではJSPJavaサーブレットでショッピングサイトみたいなものを作ったが、pomとかDAOとかなんだかよくわからず、インターン先でたまたま使うことになったPHPがわかりやすくて、PHPを扱う今の会社に就職した。

プログラマーに向いていないと言って挫折した人もまわりにいたし、実習内容はインターン先によるのでPHPと出会わなかったら自分も挫折していたかもしれない。そういう点でPHPには愛着を持っている。

働き始めたものの、せいぜいPHPでお問い合わせフォームを作りました程度のレベルだったので最初は何もわからず作業のスピードものろのろであった。

PHPの基礎もよくわからないまま、FuelPHPというフレームワークを使うことになったが、まずドキュメントの読み方がわからなかった。

大概のことはドキュメントにちゃんと書いてあるのだが、どう書けばいいのかわからないのでググってソースをコピペして、引数とか値を変えながら実際にどう動くのか体験しつつ、自分の作りたいものを実装していくという有様であった。

連想配列をforeachで回して値を取り出したり、入れたりするのを理解するまでには、ずいぶん手こずったし、「Undefined Index」のエラーの画面をじっと見てよく途方に暮れていた。

そんなこんなでも、約1年も経てば作りたいものを実装することはできるようになったとは思う。

後半

それでいて、はじめてのプロジェクトではじめての炎上を経験した。

やたらと仕様が変更するため「最初から言ってくれよ・・・」と思うことが多くて、毎日なんでこんなことになっているんだろうといつも考えていた。

要件定義をキチンとしてないからこんなことになっているんじゃないのか?、どういうものを作るのか明確になっていないからこんなことになっているのだと考えた。

また仕様書をキチンと作ってないから、こんなことになっているんじゃないのか?、仕様についてクライアントと合意した上で、作ってたらこんなことにはなってないはずだとも考えた。

そういった経緯があって、自分が直面している問題はだいたい他の人も経験しているはずなので、先人たちはどうしたのか知りたくて、これがきっかけでソフトウェア開発についての本をいろいろ読みはじめた。

『Joel on Software』 仕様書とはどんなものか? - Vapor Trail

『オブジェクト指向のこころ』 - Vapor Trail

 

どれだけ頑張ったとしても、どれだけうまく分析したとしても、ユーザからすべての要件を引き出すことなんてできっこありません。

明日のことなんて誰にも判らず、万物は流転していくのです。これは絶対不変の真理なのです。

私の30年にわたるソフトウェア開発経験で、要求について学んだ大事なことといえば、要求は常に変化するということです。

要求が変化する理由は簡単です。

  • 開発者とディスカッションを行うたびにユーザがソフトウェアの新たな可能性に気付き、自らのニーズを変更する。
  • ソフトウェア開発の進展に伴い、問題領域に対する理解が深まり、開発者側の考え方が変わってくる。 

オブジェクト指向のこころ』

 

顧客が喜ぶものをつくる際に、まだ判明していないことやわからないこと、つまり不確実性を無視してはいけないのです。

不確実性を解消するには、...まず探索や行動をするしかありませんその実践で経験からの学びをフィードバックして、知識に変えることでしか解消できないのです。

計画変更を後ろ向きなスタンスとして捉えることは終わりにしてください。短いスパンで繰り返し、足りないタスクは計画に追加し、誤った見積は修正していくのです。

カイゼン・ジャーニー』

 

日本IBMがプロジェクト終盤、スイスのテメノス製パッケージ「TCB」を採用する代替案を提示した際、「CorebankをJava化したもののパフォーマンスが悪いことが判明した」「Corebankについて日本の銀行の諸制度に合致させることが難しかったのは事実」などと述べていた。

日本IBM全面敗訴の深層 「議事録」が決め手に | 日経 xTECH(クロステック)

 

どうやら仕様変更が多いとか、仕様書が不完全なものであるとか、プロジェクト終盤になってパフォーマンスが出ないとか、手戻りやちゃぶ台返しは、そんなに珍しいことではないとわかった。

またこの経験からソフトウェア開発とはこういったものとして受け入れた上で、「自分にできることは仕様変更・追加を容易にできるようなコードを書くことしかないのだ」という結論に至った。

炎上中はどうしてこんなことになるのかと現状への不満がかなり溜まっていたが、「隣の芝生は青くないのだな」と一旦受け入れるとふっきれて楽になったように思う。

 考え方を切り替えることはできたが、時間がない中で仕様変更や機能の追加を既存のコードに付け加えていく形で実装していったので、段々とコードの見通しが悪くなっていったのがこのときの悩みであった。

なので変更を容易にする・コードをシンプルに保つための方法として、リファクタリングやテスト、オブジェクト指向、設計、アジャイル型開発への興味・関心が増えた。そして結局、銀の弾丸などないとわかった・・・。意外とみんな泥臭いことやっているんだろうなぁと考えている。

 いろいろ思うことはあったが、常に学び続ける仕事に就きたいと考えていたので、この業界で働いたことに後悔はない。

 

2019年の目標

1. 設計を学ぶ
一朝一夕で身につくものではないのでコツコツがんばる。(あいまいだなぁ・・・)


2. 他の人に負けないスキルを身に着けたい
自分の中でこれだけは他の人には負けないというものを作りたい。


3. 手を動かす
あまり学習の仕方がよく分かってなかったせいもあって、去年は本だけ読んでわかった気になっていた気がするので、黙って手を動かす(コードを書く)ようにする。

手を動かしながら2週間で学ぶ AWS 基本から応用まで Day1 Day2

手を動かしながら2週間で学ぶ AWS 基本から応用まで
https://www.udemy.com/aws-14days/

仕事でクラウド使わないと思って後回しにしてきたけど、さすがにAWSの勉強はじめました。 とりあえずクラウドラクティショナー取りたいな。

Day1 AWSのはじめかた

AWSアカウントを作ったらまずやること

1. 作業用のIAMユーザを作成する

コンソール→アカウント
IAM ユーザ/ロールによる請求情報へのアクセス
[x] IAMアクセスの有効化

IAMユーザの作成 https://console.aws.amazon.com/iam/home
ユーザ→ユーザの追加
ユーザ名入力
アクセスの種類設定
パスワード設定
パスワードリセット 他のユーザにわたすときに自分でパスワードを設定してもらえる
アクセス許可の設定→既存のポリシーを直接アタッチ→使用するサービス・権限の設定
ユーザの作成
https://xxxxxx.signin.aws.amazon.com/console

2. CloudTrailを設定する

証跡の作成
すべてのリージョンに適用
アカウントのすべてのS3バケットの選択
S3バケットはユニークなバケット名にする必要がある
作成
ユーザの操作ログが保存される

3. 料金アラートを設定する

IAMユーザの請求ダッシュボード→設定
請求アラートを受け取るに[x] CloudWatchに移動
請求→アラームの作成
請求アラームの金額・送信先を設定

4. AWS料金の見積もり方

http://calculator.s3.amazonaws.com/index.html?lng=ja_JP

Day2 EC2インスタンスを起動する

EC2の概要

VPS 仮想コンピューティング

EC2インスタンス起動までの流れ

  1. OS/Imageの選択
    リージョン:東京 AML1
  2. インスタンスタイプの選択
    t2.micro無料枠
    基本デフォルト
    セキュリティグループの設定→HTTP追加
    セキュリティグループ名:"ssh-http-full-open-sg"
    作成
    新しいキーペアの作成→キーペアのダウンロード→インスタンスの作成
    ステータスチェックを確認する
  3. ストレージの選択
  4. セキュリティグループの設定
    ssh-http-full-open-sg
    ルールの追加→HTTPを追加
  5. SSHキーペアの設定
    SSHキーを作成→ダウンロード

EC2の接続

address:パブリック DNS (IPv4) or IPv4 パブリック IP  
port:22  
username:ec2-user  
SSH Key:xxx.pem  

http://ktykwsk.com/aws-ec2%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%B8ssh%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B/
https://dev.classmethod.jp/cloud/aws/first-login-to-ec2-linux/

httpdのインストール

sudo yum install httpd  
sudo service httpd start

AMIからEC2インスタンスをつくる

AMI(Amazon Machine Image): EC2のある断面 = EC2インスタンスを作る元になる
Snapshot: ディスク(EBS Elastic Block Store)の断面 = EBSを作る元になる
https://aws.amazon.com/jp/ebs/features/
https://recipe.kc-cloud.jp/archives/7534

EC2インスタンスの停止
アクション→イメージ→イメージの作成
イメージ→AMI→作成→同じ手順(既存のセキュリティグループを使う)
作成したEC2インスタンスに接続して、httpdをstartすると立ち上がることがわかる

Elastic IPアドレスを使ってIPアドレスを固定する

EC2インスタンスを停止して再起動すると毎回別のIPアドレスが割り当てられるので固定する
ネットワーク&セキュリティ→Elastic IP→新しいアドレスの割り当て
アクション→アドレスの関連付け→アドレスを固定化したいインスタンスを指定→関連付け
指定したEC2インスタンスIPアドレスが作成されたIPアドレスになっていることがわかる

EIPの料金
インスタンスを停止していても、EIPが割り当てられていると料金が発生するので注意する
https://aws.amazon.com/jp/ec2/pricing/on-demand/#Elastic_IP_Addresses

EIPの開放
アクション→Elastic IP アドレスの関連付けを解除→アドレスの開放
インスタンスIPv4パブリックIPが変更していることがわかる