コンセプト
- とにかく動くことを確認して、細かい設定を後でやりたい人向けに
- なるはやって書いたけど、やること結構あった・・・
- 何か漏れがあるかもしれないけど、ご了承くださいませ
Elastic Beanstalkあれこれ
- Elastic Beanstalkは、以降EBと略します
注意点
- Golangに対応した環境も用意されているが、2016年7月現在、Golang 1.4と1.5の環境のみで、最新の1.6に対応していない
- 1.6のvendoringの機能は使いたい
- 今後の最新バージョンへの対応を考えて、Docker環境の上でGolangを動かしたほうがよさそう
そんなわけでDocker環境で動かす方法を書きます。
以下やること
- デプロイ先となるEBのサーバー環境を作る
- ローカルのgitリポジトリへコミット
- ローカルのリポジトリからEBへデプロイ
EC2キーペアの作成
EC2のキーペアが必要なので、まずそれを作る
- ブラウザからAWSへアクセスし、サービス一覧からEC2を選択
- n個のキーペアを押す
- キーペアの作成を押す
- キーペア名を入力して作成を押す
- pemファイルがダウンロードされるので保存しておく
アクセスキーを作る
- AWSのサービス一覧からIAMを選択
- 個々の IAM ユーザーの作成
- ユーザーの管理を押す
- 新規ユーザーの作成を押す
- ユーザー名の入力で適当な名前を入れる
- ここでは、ebtestとする
- 認証情報のダウンロードを押す
- CSVファイルがダウンロードされるので保存
- 閉じるを押す
- ユーザー一覧画面が表示される
- 先ほど作ったebtestを選択
- アクセス許可のタブを選択し、ポリシーのアタッチを押す
- フィルターに AWSElasticBeanstalkServiceと入力
- 長いので途中で名前が切れているがAWSElasticBeanstalkServiceを選択
- ポリシーのアタッチを押す
- これでこのユーザーにEBへデプロイする権限が与えられる
AWSのコンソール上でEB環境の構築
- AWSのサービス一覧からEBを選択
- 新しいアプリケーションの作成を押す
- アプリケーション名を入れて次へ
- 新しい環境
- ウェブサーバーの作成を押す
- 環境タイプ
- 事前定義の設定:Dockerを選択して次へ
- アプリケーションバージョン
- サンプルアプリケーションを選択して次へ
- 環境情報
- 環境名がデフォルトで問題なければ、そのまま次へ
- その他のリソース
- RDS DBインスタンス、VPN内にこの環境作成があるがチェックオフのまま次へ
- 構成の詳細
- インスタンスタイプ:t2.microのままでいいはず
- EC2キーペア: 先ほど作ったキーペア名を選択
- 次へ
- 環境タグ
- 次へ
- アクセス権限
- 次へ
- 情報の確認
- 起動
しばらく待つと環境構築され起動します。
※ EC2はオンデマンドの料金プランで起動するので、使用時間によって課金されていきます。よってお試しが終わったら環境を終了させましょう。
EBのコマンドラインツールをインストール
$ brew install awsebcli
$ eb --version
EB CLI 3.6 (Python 2.7.1)
リポジトリとeb環境のひもづけ
- goプロジェクトのhello.goがあるディレクトリにgitリポジトリを作る
$ git init
- ebコマンドがgitリポジトリと連動するように初期化
$ eb init
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-southeast-1 : Asia Pacific (Singapore)
7) ap-southeast-2 : Asia Pacific (Sydney)
8) ap-northeast-1 : Asia Pacific (Tokyo)
9) sa-east-1 : South America (Sao Paulo)
10) cn-north-1 : China (Beijing)
(default is 3):
- さきほど環境を作ったリージョンの番号を選ぶ
You have not yet set up your credentials or your credentials are incorrect
You must provide your credentials.
(aws-access-id):
(aws-access-key):
- 上記のようにaws-access-id、aws-secret-keyを求められ得るので、アクセスキーの項目で保存したCSVから以下の項目をそれぞれ入力。
- Access Key Id
- Secret Key
Select an application to use
1) 作ったアプリケーション名
2) [ Create new Application ]
- 作ったアプリケーション名の番号を選択
これでeb deployした時、gitの最新の状態がzipで固められてEBの環境へアップロードされ展開されるようになります。
サンプルウェブアプリ
- $GOPATH/example.jp/sample1/hello.goというファイル名でmain()を呼び出すコードを書く
- 実際の運用では、$GOPATH/ドメイン名/任意のパッケージ名/とする
- このディレクトリの構成は守ったほうがトラブルなくて良いです
- HTTPサーバーの起動は80ポートにする
hello.go
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "EBへデプロイしたった\(^o^)/")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":80", nil)
}
$ go build
ブラウザからlocalhostにアクセスすると
EBへデプロイしたった\(^o^)/
と表示されるはず。まだデプロイしてないけど。
- これをgitリポジトリへコミットします
Dockerfile
- hello.goがあるのと同じフォルダにDockerfileを作る
FROM golang:1.6-onbuild
EXPOSE 80
- gitリポジトリへコミット
デプロイ
- EBへのデプロイは以下のコマンドで行います
$ eb deploy
デプロイ後の流れ
- EB内でDockerfileにしたがって、golang 1.6が動作するDockerイメージが起動する
- ウェブアプリはDocker内部で起動される
デプロイ完了の確認
- ブラウザでAWSのサービス一覧からEBを選択
- すべてのアプリケーションから該当アプリケーションを選択
- 作った環境が開き、チェックアイコンにヘルス OKと表示されていれば成功
- 環境ID:***** URL:*****と表示さているので、そのURLを押す
- 以下のページが表示されれば成功!
EBへデプロイしたった\(^o^)/
以後は、ローカルで開発してgitへコミットし、タイミングをみてeb deployコマンドでEB上へデプロイの繰り返しです。
EBの環境の終了
先程も書いたように時間と共に課金されていくので、テストで確認しただけなら環境を終了させておきましょう。
- ブラウザでAWSのサービス一覧からEBを選択
- すべてのアプリケーションから該当アプリケーションを選択
- 作った環境が開き、アクションボタンを押す
- 環境を終了するを選択
- しばらく待つと環境が終了する