taisablog

taisa's engineer blog

未分類

【15分でできる】EC2(Web+DB)ネットワーク構築 〜画面ポチポチ〜

投稿日:


最近EC2を使うケースは少ないですが、まずは基本としてオーソドックスなEC2+ネットワーク構築の流れをまとめました。

VPCを作成する

IPv4 CIDERブロックを「10.0.0.0/16」にしてVPCを作成します。

DNSホスト名を利用するのでVPCのDNSホスト名をONにします。

パブリックサブネットを作成する

作成したVPCを選択し、IPv4 CIDERブロックを「10.0.1.0/24」にして作成します。

プライベートサブネットを作成する

作成したVPCを選択し、IPv4 CIDERブロックを「10.0.2.0/24」にして作成します。

インターネットゲートウェイを作成する

作成したインターネットゲートウェイをVPCにアタッチします。

VPCにパブリックルートテーブルを作成する

作成したVPCにパブリックルートテーブルを作成します。

作成したパブリックルートテーブルに「サブネットの関連付け」からパブリックサブネットを関連付けます。

パブリックサブネットに関連づけたルートテーブルのルートを編集し、送信先を「0.0.0.0/0」としターゲットにインターネットゲートウェイを設定します。

WebサーバーとしてEC2を作成する

作成した VPCを設定とパブリックサブネットを設定します。

IPはパブリックサブネット内の「10.0.1.10」を割り当てます。

「セキュリティグループ」をソース「カスタム」で「0.0.0.0/0」にして作成します。EC2インスタンスが作成できたらElasticIPを関連付けます。

鍵を取得してEC2にSSHアクセスする

# 例
$ chmod 400 ~/.ssh/my-key.pem
$ ssh -i ~/.ssh/my-key.pem ec2-user@ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com

Nginxをインストールする

# インストール
$ sudo yum -y install nginx
# サービス起動
$ sudo service nginx start
# 自動起動ON
$ sudo chkconfig nginx on

セキュリティグループ(ファイアウォール)を設定する

「インバウンドルール」にHTTP(80ポート)で「0.0.0.0/0」を設定しWebからのアクセスを許可します。

「パブリック DNS」でブラウザからアクセスができることを確認します。

DBサーバーとしてEC2を作成する

作成したVPCとプライベートサブネットを設定します。パブリックIPは不要なので自動割り当てパブリックIPを無効化します。

内部IPをプライベートサブネット内の「10.0.2.10」に設定します。

プライベートサブネットからしかアクセスしないので「セキュリティグループ」をソースカスタムで「SSH」と「MySQL/Aurora」にパブリックサブネット「10.0.1.0/24」を指定します。

Webサーバーに秘密鍵(my-key.pem)を送り、WebサーバーからDBサーバーにアクセス可能にします。

# 秘密鍵をWebサーバーに送る
$ scp -i ~/.ssh/my-key.pem ~/.ssh/my-key.pem ec2-user@ec2-18-178-132-45.ap-northeast-1.compute.amazonaws.com:~/.ssh/

# Webサーバーアクセス
$ ssh -i ~/.ssh/my-key.pem ec2-user@ec2-18-178-132-45.ap-northeast-1.compute.amazonaws.com

# 権限変更
$ chmod 400 ~/.ssh/my-key.pem

# DBサーバーアクセス
$ ssh -i ~/.ssh/my-key.pem ec2-user@10.0.2.10

パブリックゲートウェイにNATゲートウェイを作成する

DBサーバーにMySQLをインストールするためにパブリックサブネットのNATゲートウェイを通してインターネットへ接続可能にします。

メインのルートテーブルに送信先「0.0.0.0/0」としてNATゲートウェイを設定します。

MySQLをインストールする

# インストール
$ sudo yum -y install mysql-server

# MySQL起動
$ sudo service mysqld start

# 自動起動ON
$ sudo chkconfig mysqld on

MySQLをセットアップする

# ログイン
> mysqladmin -u root password
> mysql -uroot -p

# Schema作成
> create database example default character set utf8 collate utf8_general_ci;

# ユーザー作成と権限付与
> grant all on example.* to user@"%" identified by 'password';
flush privileges;

WebサーバーにMySQLクライアントをインストールする

WebサーバーへMySQLクライアントをインストールしDBサーバーのMySQLへサクセスできることを確認します。

# MySQLクライアントインストール
sudo yum -y install mysql

# DBサーバーのMySQLへアクセス確認
mysql -u user -p example -h 10.0.2.10

セットアップができたら必要に応じてNATゲートウェイは削除します。(料金がかかるため)

Nginxを設定する

「/etc/nginx/conf.d/nginx.conf」を編集し「root」をコメントアウトしlocationに「proxy_pass http://127.0.0.1:9000;」を追加します。

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  localhost;
    #root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
            proxy_pass http://127.0.0.1:9000;
    }    server {
# --- 省略 ---

nginxを再起動します。

$ sudo service nginx restart

アプリケーションをセットアップします。

ここではGoのサンプルアプリケーションを実行します。起動したらusersテーブルを作成し、アクセスしたらusersテーブルにレコードをinsertします。

Goをインストールします。

$ sudo yum -y install go

サンプルプログラムをWebサーバーへ配置します。

package main

import (
	"database/sql"
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"os"

	_ "github.com/go-sql-driver/mysql"
	"github.com/joho/godotenv"
)

type User struct {
	FirstName string `json:"firstName"`
	LastName  string `json:"lastName"`
}

var db *sql.DB

func main() {
	err := godotenv.Load()
	if err != nil {
		log.Fatal(err)
	}

	db = Conn()
	defer db.Close()

	_, err = db.Exec("CREATE TABLE IF NOT EXISTS users(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(255) NOT NULL, lastname VARCHAR(255) NOT NULL)")
	if err != nil {
		log.Fatal(err)
	}

	http.HandleFunc("/users", users)
	err = http.ListenAndServe(os.Getenv("LISTEN_PORT"), nil)
	if err != nil {
		log.Fatal(err)
	}
}

func Conn() *sql.DB {
	db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:3306)/%s", os.Getenv("MYSQL_USER"), os.Getenv("MYSQL_PASSWORD"), os.Getenv("MYSQL_HOST"), os.Getenv("MYSQL_SCHEMA")))
	if err != nil {
		log.Fatal(err)
	}
	return db
}

func users(w http.ResponseWriter, req *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	user := User{
		FirstName: "John",
		LastName:  "Doe",
	}
	var users []User
	users = append(users, user)

	stmt, err := db.Prepare("INSERT INTO users(firstname, lastname) VALUES(?, ?)")
	if err != nil {
		log.Print(err)
		return
	}

	_, err = stmt.Exec(user.FirstName, user.LastName)
	if err != nil {
		log.Print(err)
		return
	}

	json.NewEncoder(w).Encode(users)
}

main.goと同一ディレクトリに.envファイルを作成し環境変数に値を設定します。

MYSQL_HOST=10.0.2.10
MYSQL_USER=user
MYSQL_PASSWORD=password
MYSQL_SCHEMA=example
LISTEN_PORT=:9000

動作確認をする

パブリックDNSにアクセスしてJSONが返ってくることを確認します。

DBレコードを確認する

WebサーバーからDBサーバーへアクセスしusersテーブルにレコードが入っていることを確認します。

$ mysql -u user -p example -h 10.0.2.10
mysql> select * from users;
+----+-----------+----------+
| id | firstname | lastname |
+----+-----------+----------+
|  1 | John      | Doe      |
+----+-----------+----------+
1 row in set (0.00 sec)

 これで一通りのセットアップが完了しました。次からはこの環境を下記のツールでセットアップしてみます。

  • CloudFormation
  • CDK
  • Terraform

-未分類

執筆者:

関連記事

no image

2019年前半の振り返り

2019年が半年を過ぎたので振り返ります。 2019年の抱負 本業頑張るのはもとより、2019年の抱負がある程度固まってきたので書いておきます。 これまでAWSを自分で多く触るケースはあまりありませんでしたが、GCPを使うケースが増えてきたので今年からはAWSではなくGCPをたくさん触っていこうと思います。 … Google Cloud Platformを使う Firebaseを触る機会があって、FirestoreやCloud Functionsを扱いました。あとGCEに migro instance を使って sandbox ページ( http://sandbox.taisablog.com/)を立ててみたりしました。 FirebaseもGCEもかなりいい感じなので今後は個人でちょくちょく使っていくと思います。 Firebase Cloud Firestore 使い方の勘ドコロ 数学をやる 間に合わせ程度に以下の投稿にある内容をやりました。次はまたしばらく必要になりそうなタイミングになったら進めてみようと思います。 小学校6年間の算数から中学3年間の数学までを復習してみた 宅建をとる いろいろと調べたり少しやってみたりしたところ、以下をやればなんとか合格できる気がしましたが状況が変わってきたので受験するのはやめました。 宅建みやざき塾でテキストを購入(テキストだけの購入は不可) 何回か講義を受ける 3月頃にはじめて10月に向けて通勤時間などを活用して約300時間くらい費やす 直前に対策講義を受ける 体力をつける 相変わらず走れていませんが軽い筋トレをしつつ体重は4キロ程減らせました。あと3キロ減が目標です。 ブログ記事 1月から6月末までで11記事でした。年間月2記事で24記事を目安にしているので1記事程足りないペースでした。 2018年振り返り、プレイングマネージャーは難しく 2019年の抱負 PHPの empty, isset, is_null の違いをしっかり理解する PHPライブラリをPackagistに登録する方法 GitLabのprivateなPHPライブラリをcomposer installするには C言語初級者がMacのコンソールで実行可能なテトリスを作ってみた PHPによるDBUnit超入門 私はこうしてGoogleに入社/退社しました系記事まとめ 小学校6年間の算数から中学3年間の数学までを復習してみた Firebase Cloud Firestore 使い方の勘ドコロ Go言語 ORMライブラリ GORMの使い方 7月の記事 Go言語 GORM+GinでTODOリストを作ってみた Go言語 GORM+GinでTODOリストのAPIを作ってみた 目標の見直し 2019年後半は以下をがっちり身に着けることを目標にします。目標の詳細については違うタイミングで少しブレイクダウンする予定です。 技術系 JavaScript(Vue.js) Go CSS / Stylus AWS その他 健康体を維持する / 体力をつける

小学校6年間の算数から中学3年間の数学までを復習してみた

はずかしながら小学校算数から中学校数学までを復習してみたのでまとめておきます。 動機 もともとはこちらの「文系エンジニアが機械学習に入門するために小学校の算数から高校数学までを一気に復習してみました。」の記事を見たのがきっかけでした。復習しようにもどうアプローチしたらよいかわからなかったからです(私の場合は機械学習よりかはただの興味という感じです)。もともと高校数学を少しやってみようかと思っていましたが、そもそも高校入ってからは真面目に授業を受けていなかったので高校数学などほとんど覚えていません(高校入るまではそれなりに勉強していましたが..)。それで高校数学をやるとすぐくじけそうなので、中学数学までをやってみることにしました。タイトルに時間があるのも心理的にとっつきやすくてよかったです。 教材 教材は記事にあった以下の教材を使いました。公立高校受験レベルですがとても分かりやすくまとまっていてよい本でした。ほとんど通勤時間にみていたのでかかった時間は分かりませんが、小学校算数は6時間もかからず、中学校数学は大体6時間くらいだったかと思います。ただ読んでいるだけだと分かった気になるだけなので、こちらの問題「都道府県別 公立高校入試[問題・正答]」を少し解いたりしました。 小学校6年間の算数が6時間でわかる本 中学3年間の数学を8時間でやり直す本 目次 小学算数 PART1 分数の計算 PART2 少数の計算 PART3 面積図・線分図・方程式 PART4 すばやく計算 PART5 割合 PART6 比 PART7 単位量あたりの大きさ PART8 速さ・時間・道のり PART9 平面図形 PART10 立体図形 PART11 比例・反比例 PART12 場合の数 中学数学 PART1 正の数と負の数 PART2 文字式 PART3 1次方程式 PART4 連立方程式 PART5 因数分解と展開 PART6 平方根 PART7 2次方程式 PART8 確率 PART9 1次関数 PART10 関数y=ax2 PART11 図形 PART12 三平方の定理 おまけ ついでに暗算も少しは早くできるようになりたいということで検索して一番にヒットした「暗算を簡単にする10の方法」も少しやってみました。他にもよい暗算の方法があれば教えてほしいです。 左から右に 細かい文字をシンプルに 分数、少数のきまりを覚えておく 数字の「0」と「5」を利用する 倍数を使いこなす 大まかな数字を出す 数字を”リフレーズ”と”リアレンジ”する 答えが合えばそれでいい 億単位の数字にも計算方法はある チップを計算する簡単な方法 まとめ まだまだ先ですが子供らの高校受験まではある程度教えられるかなという気持ちになりました。ただ実際にはちょっと問題を解いただけなので、またその頃になったら復習しているかもしれません。次は時間を見つけて高校数学で面白そうな分野(機会学習にも役立ちそうな?)を選択してやってみようと思います。

no image

2017年の振り返り

2017年も残りわずかとなったので年を越してしまう前に振り返る。結論から言うと今年は近年稀に見るいい年になった。というのも今年立てた目標や中長期的に立てていた目標を達成することができたから。今年立てた目標はこちら。これらの内容について簡単に振り返る。 2017年の抱負 2017年になって1Qが終わろうとしているけど、年末に考えた2017年の抱負を書こうと思う。 2017年の抱負 いろんなことはできないので3つ+サブ目標で考えた。 生産性 ビックデータ ビジネス・インテリジェンス サブ目標 フロントエンド 英語 生産性 これまでも開発の生産性を意識した活動をしてきたが、全員の開発効率アップ、品質アップのような守備的な活動が多かった。けど今年はスクラム体制にして攻撃的な面も加えていきたいと思う。 去年までの振り返り 去年までは2人1組のような小さなチームで開発し、できたらリリースするというサイクルで開発していたが、以下の問題が細かく積み重なってきていた。(サービスの規模がそういった状況に陥る状況にまで成長したとも言える。) マネージャーの管理コストが高い 要件定義して開発に仕事を振る側の負担が大きい 開発者が指示待ちになる 開発した機能が属人的になる 開発メンバーが他のメンバーが何をしているか把握できない(チーム感がない) 開発・営業・運用で足並みを揃えるのが難しい これらの問題を一気に解決する為に2017年からはスクラム体制で開発を進めることした。 スクラムのチーム構成 最初のスクラムチームの構成は以下の7人体制 プロダクトオーナー スクラムマスター(自分) 開発チーム デザイナー兼コーダー 中堅エンジニア 2~3年目のベトナムメンバー(2人) 新卒エンジニア スクラムを始めるあたり読んだ資料と書籍 Wikipedia まず最初に見たのがWikipedia。スクラム自体はある程度決まった型があるので、ここを見るだけでも大体の流れを確認することができた。また、スクラムガイドがリンクされているので合わせて読んだ(こちらも17ページ程)。 SCRUM BOOT CAMP THE BOOK 次に読んだのがこちら この本はスクラムについての概要はわかったけど実際どんな風に進めたらよいかが分からないという方におすすめ。実際の流れを漫画を交えて説明してるので読みやすいし一連のスクラムの流れがわかる。個人的にはスクラムガイドとこの本を読めばスクラムを開始できると思う。 スクラム実践入門 他の書籍も一応見ておこうと思って呼んだのがこちら 生産性 今年の大きな目標の柱として、生産性というのをあげていた。これまでも意識していたことではあるが今年は具体的にスクラムという取り組みを取り入れて実践した。生産性を意識する背景は、主に人口減少・人手不足などがある。とにかく時間をかけて仕事すれば結果がついてくるという時代ではなくなっている今、あたらめて生産性を意識して仕事することにした。結果的にはスクラムマスターとして約1年間スクラム開発をし、一定の成果を出すことができたと思う。スクラムがどんなものか、スクラムを導入するとどんな結果が得られるかが把握できたのでこれからに生かせる経験をすることができた。 ビッグデータ ビッグデータに関する知見はほぼ皆無に等しかったが、今年はAWSを利用してビッグデータに関するサービスをやろうと考えていた。そんな折ちょうどその文脈で新規サービスを立ち上げることになり約5ヶ月位かけてスクラム体制で開発をした。ビッグデータに関しては、AWSサミットに参加したことでどのようなアーキテクチャにすればよいかが考えられたのが大きかった。具体的にはデータレイクという手法を取り入れた。サービスについてもスクラム体制がなんとか機能してスケジュールを大きくはずすことはなかった。実際ビッグデータに関してはデータがたくさんたまるというところまではいけなかったが、それでも1年前にはまったくなかった経験と知見を得ることができた。 ビジネス・インテリジェンス ビジネス・インテリジェンスに関しては、ビッグデータとほぼ同様の文脈なので特記することはないが、ただビッグデータを扱うだけでなくしっかり示唆を出せるものをつくることができた。ただ、機械学習やデータサイエンスといったことを取り入れるところまでは至らなかったのでこれらは来年の主軸の目標にする。 フロントエンド フロントエンドは、今年ようやく本格的にモダンな技術を取り入れることを決意してチーム一丸となって脱jQueryを果たした。業務外でVueJS、React、Angularの勉強会などを行い最終的にはVueJSを採用した。VueJSでやったことをすべてjQueryでやってたらめっちゃ大変な上にサービスの更新も大変だっただろうと思う。本当に導入できてよかった。 英語 英語までは絶対手が回らないだろうと思ってサブ目標にしていたが、案の定英語は他と比べると一番手をつけることができなかった。ただ、2017年の目標は以下の2つだったのでこれについてはしっかり達成することができた。そして2018年は2017年よりも時間を割いて、英語を少しでも楽に使えるようにしたいと考えている。 英語の勉強をするというよりは英語を使う環境に身をおける状態にする 英語の技術系podcastを聞く まとめ ここに書いていない中長期的に立てていた目標も今年で達成することができたので総じて2017年は良い年になった。無理に目標を立てすぎないというのがよかったのだと思う。自分の体調やキャパを考えるとできることはどうしても限られてしまうのでその中でできることを来年も考えてやっていこうと思う。

no image

2020年半年の振り返り

2020年も半年が過ぎたので年初に立てた抱負を簡単に振り返ってみます。 2020年の抱負 2020年の抱負 Golang(◯)業務でやれたのでVueJS(△)業務で少しやれたのでReact(✕)Pending(やりたいけど)TypeScript(△)読書会で少しずつ進めてるのでAWS(◯)業務でやれたのでPython (Flask)(◯)大分理解できたので執筆(◯)遅れつつも着実に進められているのでブログ継続(△)執筆に時間をさいているので少なめなので現時点でこの記事含めると8記事なので6記事Delay会社のDeveloperブログが立ち上げられたのでよかった 中長期的な話 楽しく仕事をする 良いプロダクト(◯)良いメンバー(◯)良い技術スタック(◯) これは今の所継続できていますが、年初に採用もやることになってエンジニア採用ができなかったのは反省点。これまでがっつりやることなかったので良い経験にはなりました。 生活面 腕立て・スクワット・プランク(◯)ランニング(✕)後半もリモートが続きそうなので厳しそう家で飲みすぎない(◯)家でタバコをなるべく吸わない(✕)後半もリモートが続きそうなので厳しそう 会社で週1で走ってましたが、フルリモートになったのでランニングはできなくなりタバコ(IQUOS)の量は増えました。筋トレはやり方を変えつつも継続できています。 まとめ Goを書きつつインフラ周りの作業をすることも多くなってきて、これまでやりたくてもできなかったところでもあるのでだいぶ楽しくなってきました。執筆もあと一息なのでなんとか予定通りに仕上げて年内には完成させたい。

no image

2018年の抱負

今年も去年と同様に2018年の抱負を書く。 2018年の抱負 去年と同様にいろんなことはできないので大目標3つ+サブ目標。これ以外にも細かいものはいくつかあるけど別途まとめる。 CTOとして 機械学習 英会話 サブ目標 引き続きフロントエンド CTOとして 今年1月から不動産テックのスタートアップカンパニーであるCocolive.Inc(ココリブ)にCTOとしてジョインした。エンジニアとして長年やってきたけどCTOははじめて。そしてスタートアップながら良いエンジニアが5人集まったという好状況なのでこれまでのチームビルディングの経験を活かしつつ会社を成長させていきたい。自分個人の目標は昔から「日本のエンジニアの地位をあげる・世界に通用する」であるのでこれはぶれないようにする。また合わせて決めていることは「選択と集中」をすること。限りあるリソースの中でできることできないこと、やるべきことやらないことを見定めて1年やる。あとは楽しむこと。 機械学習 今年技術的には一番力を入れる予定。個人的な興味と現在のサービスの性質上なんらかの形で機械学習が導入できると大きなメリットが見込めることから本格的にスタートすることにした。 機械学習の勉強会を開催する 機械学習の話をいろんな人とする プロダクトに導入する 英会話 これまでほそぼそとやっていたけど実践では全然だめという状況なのでこれをなんとか打開したい。今年は1年間継続して実践メインで徐々に英語慣れしていく。去年はPyCon APAC in マレーシアに参加したけど今年は5月末にシンガポールで開催されるということでここを一つのターゲットとしてやる。 コミュニケーションがとれること サブ目標 いくつもやりたいことをこなすなんてことは自分にはできない。けどサブとしてでもやりたいもの。 フロントエンド 去年はサブでなくもはやメインとして活動できてなおかつ執筆もできたので結果的にすごいよかった。JSはやればやるほど面白いので引き続きやる。 VueJSの深掘り Reactの深掘り CSSやる コードリーディング 今年の抱負のまとめ なにはともあれ健康で楽しく仕事ができていることがなによりなので毎日「今日も生き抜こう©」とつぶやきながらマイペースにやっていく