TerraformとDataDogで始めるMonitoring as Code入門

はじめに

この記事は、dwango advent calenderの12日目の記事です!
今年に入ってから、自分の担当しているプロダクトではDataDogを利用してシステムの監視を行なっています。
DataDogを導入したキッカケの一つとして、Terraformで監視設定を構成管理配下に置いてコード化したい!ということがありました。
同じ設定をGUIでぽちぽちするのはなかなかに辛いですし、ドキュメントを書き続けるのも辛いので、すでにAWSのインフラ環境構築で行なっていることと同じようなフローでコード化が行えるのは魅力の一つでした。
ということで、今回は簡単なサンプルコードと共に、TerraformとDataDogで始めるMonitoring as Code入門したいと思います。

事前に必要な作業

  • AWSアカウント、アクセスキー/シークレットキーの準備

    • 1インスタンスぽこっと立ち上げます
  • terraformのインストール
    • 今回は0.11.x系を対象に
    • tfenvが便利
  • DataDogの API Key, Application Keyの払い出し
  • DataDogのslack Integration連携

Terraform DataDog Providerでは何を操作できるのか

2017/12現在、TerraformのDataDog Providerでは以下のリソースの操作を行うことができます。

  • downtime

  • monitor
  • timeboard
    • ダッシュボードのうち、timeboardの設定(Screenboardはまだできないっぽい?)
  • user
    • ユーザー周りの設定
    • 今年導入された、read-onlyユーザーには未対応な模様
      この記事では、入門ということで、monitorのみ設定します。
      コードはこちらにあげてあります。

AWS環境の立ち上げ

  1. 上記のリポジトリをgit clone後、下記のようなコマンドでインスタンスに登録するkey_pair用の秘密鍵/公開鍵を作成します
    ※AWS構築時のアクセスキーやプロファイルの設定については割愛します
$ cd aws/
$ ssh-keygen -t rsa -N "" -f batsion
$ mv batsion batsion.pem
  1. secret.tfvars.templateをコピーし、作成した公開鍵とagentのインストール時に利用するDataDogのAPI Keysを埋めます
  2. $ cp secret.tfvars.template secret.tfvars
    $ vim secret.tfvars
    bastion_public_key    = "実際の公開鍵"
    datadog_api_key = "実際のAPI Key"
    
  3. terraformを実行し、VPC作成〜インスタンス作成まで行います(apply時にapproveを求められるのでyesを入力

# terraform provider取り込み
$ terraform init
# plan実行
$ terraform plan  -var-file=secret.tfvars
# apply実行
$ terraform apply -var-file=secret.tfvars

以上で監視対象のインスタンスが作成されました。
追加されるとこんな感じにDataDogの方に現れます。
スクリーンショット 2017-12-12 1.49.40.png

DataDogの監視設定追加

さて、続けてmonitor設定の追加を行います。
1. secret.tfvars.templateをコピーし、DataDogのAPI Keys, Application Keysを埋めます

$ cp secret.tfvars.template secret.tfvars
$ vim secret.tfvars
datadog_api_key = "実際のAPI Key"
datadog_app_key = "実際のApplication Key"
  1. terraformを実行し、monitor作成まで行います(AWSの時同様にapply時にapproveを求められるのでyesを入力
# terraform provider取り込み
$ terraform init
# plan実行
$ terraform plan  -var-file=secret.tfvars
# apply実行
$ terraform apply -var-file=secret.tfvars

以上でmonitor設定の追加が行われました。
今回はsystem.cpu.user(インスタンスのCPU usertime)の5分平均が50%以上であればwarnnig、60%以上であればcriticalとし、事前に設定したslackチャンネルに通知するようにしています。
これらは、variable.tf にてデフォルト値が設定指定あるので、変更したい場合は適宜変更してみてください。
※例えば下記のように

datadog_monitor_slack_channel = "slack-system-alert"
datadog_monitor_cpu_usertime_thresholds_warning = "60"
datadog_monitor_cpu_usertime_thresholds_critical = "70"

アラートテストを行う

さて、監視がうまくいってるかどうか確認、ということで作成したインスタンスにログインし、インスタンスに負荷を適当にかけてみます
※デフォルトのSecurity Groupでは、サンプルということでどこからでもSSHが可能なようにしているため、batsion_ingress_cidr_blocksの値を適宜変更すると安全かもしれません

# ログイン
$ ssh -i bastion.pem ec2-user@[インスタンス EIP]
# 負荷をかける
$ yes >> /dev/null &

上記を実施後、しばらくすると下記のようにアラートが飛んできます!
スクリーンショット 2017-12-12 1.57.16.png

ということで、yesコマンドを停止し、復旧通知を確認して終了です。おつかれさまでした。
スクリーンショット 2017-12-12 2.11.52.png

なお、作成したインスタンスはterraform destroy -var-file=secret.tfvarsを実行することで削除可能です。

終わりに

簡単でしたが、Monitoring as Code入門でした。
DataDogには、今回のような簡単な監視だけでなく、他にも様々なメトリクスアラートやもっと高度な機械学習型のアラートが存在するので、よりうまい具合に活用しつつ、Monitoring as Codeを推し進めていきたいな、と思います。

続きを読む

はじめてのServerless ✕ Webpack ✕ TypeScript


このエントリーはaratana Advent Calendar 201712日目のエントリーです。

こんばんは!最近Google Home MiniAmazon echo dotを購入したはいいが置き場所に困っている蔭山です。
みなさんはどのような場所に置かれているのでしょうか。。。

前日は新卒エンジニアには決して見えない安定感をお持ちの猿渡くんの「NoSQLについて何か。」という記事でした!
NoSQL?あぁ、聞いたことはある。
みたいな僕でもわかりやすい記事でした!
最近AWSに興味が出始めたところでしたので、ぜひDynamoDBを使って軽い画像投稿サービスでも作ってみます!

さて今回はServerless ✕ Webpack ✕ TypeScriptの組み合わせで使えるように手順をまとめてみたいと思います!

動作環境

今回の動作環境は以下になります!

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G1114

$ node -v
v8.2.1

$ serverless -v
1.24.0

$ webpack -v
3.5.6

環境準備

nodeやserverlessのインストールについては下記記事を参考に。。。

とりあえずやってみる

まずはServerlessのプロジェクトを作ってみましょう

$ serverless create -t aws-nodejs -p hogehoge
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/Users/fugafuga/hogehoge"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.24.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-nodejs"
$ cd ./hogehoge

JSer御用達npmを使って必要なパッケージをダウンロードしましょう。

$ npm init
$ npm install --save-dev serverless-webpack serverless-offline ts-loader typescript webpack

インストールが終わり次第、各種設定を行います。
今回はTypescript -> ES2015へのコンパイルを目的に設定させていただきます。
細かい設定内容に関しては割愛します。

./serverless.yml
service: hogehoge

provider:
  name: aws
  runtime: nodejs6.10
  stage: dev
  region: ap-northeast-1

plugins:
- serverless-webpack
- serverless-offline

functions:
  hello:
    handler: handler.hello
    events:
     - http:
         path: hello
         method: get
./webpack.config.js
module.exports = {
  entry: './handler.ts',
  target: 'node',
  module: {
    loaders: [{
      test: /\.ts$/,
      loader: 'ts-loader'
    }]
  },
  resolve: {
    extensions: ['.ts']
  },
  output: {
    libraryTarget: 'commonjs',
    path: __dirname + '/.webpack',
    filename: 'handler.js'
  }
};
./tsconfig.json
{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs"
  },
  "exclude": [
    "node_modules"
  ]
}

準備はできたので、次はTypeScriptでコーディングしてみましょう!

./handler.ts
export * from './src/ts/functions/hello';
./src/ts/functions/hello.ts
export function hello(event, context, callback): void {
  const response = {
    statusCode: 200,

    headers: {
    },

    body: JSON.stringify({
      "message": "Hello Serverless x Webpack x TypeScript!!"
    })
  };

  callback(null, response);
};

コードが書けたらローカル環境で動作確認

$ sls offline
・・・・・・・・・・・・・・・・
途中は割愛。m(__)m
・・・・・・・・・・・・・・・・
Serverless: Routes for hello:
Serverless: GET /hello

Serverless: Offline listening on http://localhost:3000

きちんと動作するか確認。

$ curl -X GET http://localhost:3000/hello
{"message":"Hello Serverless x Webpack x TypeScript!!"}

動作が問題なければ、早速デプロイしてみましょう!

$ sls deploy
・・・・・・・・・・・・・・・・
途中は割愛。m(__)m
・・・・・・・・・・・・・・・・
api keys:
  None
endpoints:
  GET - https://hogehoge.execute-api.ap-northeast-1.amazonaws.com/dev/hello
functions:
  hello: hogehoge-dev-hello

デプロイが完了したようです。
では早速動作確認。

$ curl -X GET https://hogehoge.execute-api.ap-northeast-1.amazonaws.com/dev/hello
{"message":"Hello Serverless x Webpack x TypeScript!!"}

ちゃんと動きましたね!

最後に

無理やりTypeScriptを使った感が凄まじいですね。。。申し訳ありません><
僕個人がTypeScriptを使ったことがなかったため使ってみたかったんです

明日は新卒田村くんの「Ctagsで自由な翼を得たVimについて」です!
お楽しみに!

参考

主にこちらの記事を参考にさせて頂きました!ありがとうございますm(__)m

続きを読む

AWS Cloud9 のPHP/MySQL を 7.1/5.7 にしてみる

PHP Advent Calendar 2017 の9日目です。

Docker を絡めた内容にすると予告してましたが、がらっと変更してしまいました・・・
新しく選んだテーマは、「AWS Cloud9」です。

AWS Cloud9 とは

「AWS Cloud9」とは、今年の11月末から12月頭にかけて開催された「AWS re:Invent 2017」で発表された新しいサービスです。

Cloud9 自体は以前からサービスされていたもので、2016年7月に Amazon に買収されて、とうとう AWS に統合されたという流れです。

Cloud9 は、ブラウザ上で動作する IDE で、複数の開発言語に対応し、共同作業が可能という特徴があるサービスです。それが、AWSに統合されたということで、IAMベースのユーザ管理や、ネットワークの制御等もできるので、より細かい管理ができるという形になります。

セットアップしてみる

とりあえずは、AWSのアカウントが必要なので、もし持っていない場合は作成する必要があります。アカウントの作成が終われば、「AWS Cloud9」の環境構築となります。

「AWS Cloud9」は現在以下のリージョンのみで提供されています。

  • EU(アイルランド)
  • アジアパシフィック(シンガポール)
  • 米国東部(バージニア北部)
  • 米国東部(オハイオ)
  • 米国西部(オレゴン)

残念ながら、東京リージョンには来ていないので、今回は「米国東部(バージニア北部)」(us-east-1)で試してみます。

welcome 画面

Welcome to AWS Cloud9.png

まずは、「AWS Cloud9」のサービストップの「Create environment」をクリックします。

Step1 Name environment

step1.png

Step1として、環境名(Name)と説明文(Description)を入力して、Step2へ行きます。

Step2 Configure settings

step2.png

Step2では、 作業するための環境設定を行います。

Environment Type としては、以下の2つを選ぶことになります。

  • 新しい EC2 インスタンスをこの環境用に起動する
  • 既存のサーバーに SSH 接続して作業をする

今回は、新しいインスタンスを立てますが、既存サーバーへの接続での共同編集というのも面白そうですね。

Environment Type で新しいインスタンスを使うことを選択した場合は、EC2 のインスタンスタイプを選択します。

また、コストを抑えるための設定があります。デフォルトでは、IDEを閉じてから30分後にインスタンスが停止され、再度IDEを開くとインスタンスが再起動するというものです。

それ以外の設定として、使用する IAM role と ネットワークの設定が行なえます。特に設定しなければ、Cloud9しか制御できない IAM role で、新しい VPC ネットワーク が設定されます。

ちなみに、既存のサーバーに SSH 接続する方を選択すると以下の選択肢になります。

step2-ssh.png

Step3 Review

step3.png

確認画面です。内容に問題がなければ、「Create environment」ボタンを押して、環境作成を開始します。

この画面では、以下のような注意が表示されます。

step3-info.png

「Create environment」ボタンを押すと、環境作成中画面ということで次のような画面になります。環境は、だいたい 2 〜 3 分くらいで作成されました。

build-cloud9.png

「AWS Cloud9」 IDE 画面

cloud9.png

IDE の画面としては、オーソドックスな画面で、左側にソースツリー、右側の上部のメインとなる部分にソース等の表示がありますが、右側の下部がターミナルになっているというのが面白いですね。

ここで、起動したインスタンスの情報を見てみるとこんな感じでした。

uname.png

さらに、起動したインスタンスの PHP と MySQL のバージョンをみてみると・・・

default_php_mysql_version.png

PHP はともかく、MySQLが 5.5 というのがちょっとつらい。

というわけで、アップグレードするためのシェルを準備しました。以下のものをターミナルから実行するとPHPとMySQLがバージョンアップできます。

sh -c "$(curl -fsSL https://gist.githubusercontent.com/kunit/c2cc88d18d4ce9ad972bab2bdc3b6f3f/raw/27f538fe5d21d024f72a6dfbee7563dc7247ad46/aws-cloud9-php71-mysql57.sh)"

実行する sh の内容を貼っておくと以下のような感じです。

(2017/12/10 10:12 追記) 最初書いていたスクリプトは、わざわざ PHP 5.6を削除してましたが、 alternatives の機能を使えば、PHPの切り替えができたので、7.1をインストールして、 alternatives で切り替えるものにしました

https://gist.github.com/kunit/c2cc88d18d4ce9ad972bab2bdc3b6f3f

#!/bin/sh

sudo service mysqld stop
sudo yum -y erase mysql-config mysql55-server mysql55-libs mysql55
sudo yum -y install mysql57-server mysql57
sudo service mysqld start

sudo yum -y install php71 php71-cli php71-common php71-devel php71-mysqlnd php71-pdo php71-xml php71-gd php71-intl php71-mbstring php71-mcrypt php71-opcache php71-pecl-apcu php71-pecl-imagick php71-pecl-memcached php71-pecl-redis php71-pecl-xdebug
sudo alternatives --set php /usr/bin/php-7.1 
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/bin/composer

この sh を実行すると、以下のように、PHP 7.1.11 および MySQL 5.7.20 の環境になります。

upgrade_php_mysql_version.png

では、実際のコードを編集および動作させてみよう

環境を作っただけで満足してしまいそうですが、実際のコードを動かしてみたいと思います。

サンプルとして使用させていただいたのは、CakePHP Advent Calendar 2017 2日目の @tenkoma さんの記事、CakePHP 3 のチュートリアルにユニットテストを追加する (1) のコードです。

AWS Cloud9 のターミナルから、以下のコマンドを実行し、ソースコードの取得及び compose install を行います。(us-east-1 で起動しているので、composer install もさくっと終わります)

git clone https://github.com/tenkoma/cakephp_cms.git
cd cakephp_cms
composer install

そして、サンプルを動かすために、MySQLにテスト用のデータベースを作らないと行けないので、以下のコマンドを実行します。

mysql -u root -e 'CREATE DATABASE test_cake_cms CHARACTER SET utf8mb4;GRANT ALL  ON test_cake_cms.* TO cakephp@localhost IDENTIFIED BY "AngelF00dC4k3~";FLUSH PRIVILEGES;'

あとは、Cloud9 の IDE 上から、 cakephp_cms/config/app.php のテストデータベースの設定部分を編集して、ターミナル上から phpunit を実行すると、次のようになります。

edit_app_and_phpunit.png

ターミナル部分を拡大するとこんな感じです。

phpunit.png

キーバインド

IDEの設定項目がありますが、最初に変更したのがこちら。

keybinding.png

プルダウンの種類的には、以下の4つでした。

  • default
  • Vim
  • Emacs
  • Sublime

ダッシュボード

IDEを開いたタブを閉じても、ダッシュボードに行けば再度 IDE を開き直せます。

dashboard.png

何もせずに、環境構築時に設定した時間が経過したらインスタンスは自動的に停止され、次にIDEを開いたときに再起動されます。

AWS Cloud9 の料金

AWS Cloud9 自体は無料で、使用する EC2 インスタンスに対する課金のみとなります。そういった意味で、IDEを閉じたら、30分後にEC2を自動停止してくれるというのは結構ありがたいですね。

最後に

AWS Cloud9 ですが、ちょっとした共同作業の環境として使えるだけではなく、使いようによってはおもしろい使い方ができるかもと思っています。

普段 PhpStorm という超強力な IDE を使っているので、それとくらべて IDE としての使い勝手はどうなんだということも今後いろいろと試してみたいなと思ったりもしています。

AWS アカウントさえあれば、本当に簡単に起動できるので、みなさんも試してみるのはいかがでしょうか?

明日の担当は、@hanhan1978 さんです。

続きを読む

AmazonLinux に Zabbix3.0 をインストールした話

構成

Zabbix Server : EC2
Database : RDS(MariaDB)

EC2やRDSの構築は飛ばします

必要パッケージのインストール

EC2にSSHでログインして、以下。

PHP & Apache

yum -y install httpd24 mysql php70 php70-devel php70-gd php70-mbstring php70-mcrypt php70-pdo php70-pecl-apcu-devel zlib-devel php70-mysqlnd php70-bcmath

mariadb

RDSを使うので不要

PHP の設定

vim /etc/php.ini

リポジトリのインストール

rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm

AmazonLinux は init 制御なので RHEL6 版をインストールします。
systemd に変わったら RHEL7 版に変更。

Zabbix3.0 のインストール

yum install zabbix-server-mysql.x86_64 zabbix-web-mysql.noarch zabbix-web-japanese.noarch zabbix-get zabbix-agent

設定

cp /usr/share/doc/zabbix-web-3.0.9/httpd24-example.conf /etc/httpd/conf.d/zabbix.conf
vim /etc/httpd/conf.d/zabbix.conf

以下を変更します。

  • 読み込むモジュールの変更

    変更前:<IfModule mod_php5.c>
    変更後:<IfModule mod_php7.c>

  • タイムゾーンの設定

    変更前:#php_value date.timezone Europe/Riga
    変更後:php_value date.timezone Asia/Tokyo

続きを読む

本番環境をGCP/AWSで何個か作り、インフラについて少しわかったこと【GCP環境構築編】

Hakusan Mafiaアドベントカレンダー5日目を余語 [Qiita|facebook|github] が担当します!

本番環境をGCP/AWSで何個か作り、インフラについて少しわかったこと【SSL証明書編】
本番環境をGCP/AWSで何個か作り、インフラについて少しわかったこと【GCP環境構築編】 ←今これ
本番環境をGCP/AWSで何個か作り、インフラについて少しわかったこと【パフォーマンス改善編】

はじめに

以前はAWSでインフラ環境を整えるのがベストプラクティスかと思っていました。というのも、EC2は直感的に触って起動できるし、S3・RDS・ DynamoDMなどの記事も相当Webに溢れていたので簡単でした。ただ、プレスリリースを売ったりメディアに出したりする案件があった際にわざわざAmazonへ申請を出さなければならないといけないらしいということを聞いて少し疑問に感じた時もありました。

そんな時に、AWSと同等のものを用意してくれている。且つ、自動スケーリングが凄い(詳しくいうと、ロードバランサがGoogle検索と同じらしい)という記事を見た時に、少々衝撃を覚えました。

今回の記事では、Google Cloud Platform(GCP)を利用して本番環境を構築する方法を記述します。
基本的には、公式ドキュメント通りにやると全てうまくいくのですが、自分のターミナルから色々いじりたい人用に書いてます。

10分でGCP環境構築

1. ログイン、プロジェクト作成

https://cloud.google.com/?hl=ja の右上でログインし、その後「コンソール」へ入る
プロジェクト作成から、「プロジェクト名」を入力して、準備完了

2. GCEを選択し、VMインスタンス作成

https://gyazo.com/0581708139112c11db672d5cdcfb7ea6

名前は適当で、
- ゾーンを「asia-northeast1-a」
- ブートディスクに今回は、「CentOS」
- ファイアウォールの設定は二つともチェックを入れましょう。

https://gyazo.com/5cc259ec583d4635073f1876cbbd28e6

3. Terminalにてgcloudログイン

今回は、ミドルウェア、とりわけWebサーバーをNginx、ApサーバーをUnicornで実装します。
OSは先ほどCentOSを利用すると選択したので、webにあるDebianでの記事と比較しながらやると勉強になると思います。
(RoRアプリケーションを想定しています。)

ミドルウェアの設定は次の通りです。

ミドルウェア 項目
nginx conn./worker 1024
unicorn worker processes/cpu 2 or 3

インスタンス作成後に、そのVMインスタンスの「接続」から「glcloud コマンドを表示」という箇所でコマンドをコピーして、ローカルで接続して見てください。

local
$ gcloud compute --project "xxxxx-yyy-1111111" ssh --zone "asia-northeast1-a" "xxx"
Last login: Sun Dec  3 08:13:59 2017 from softbankxxxx.bbtec.net

server
[xxxx@yyyy ~]$ #こんな感じでログインできる

先ほどGoogle Compute Engineで作成したVMインスタンスにログインできる。
(ここで弾かれたら、permission関連なのでgithubのSSH and GPG keysという箇所に公開鍵を貼り、ログインしてください。)

gcloudがないと言われたら、下記でインストール&ログイン

local
$ curl https://sdk.cloud.google.com | bash
$ gcloud init

4. 権限管理・ミドルウェアのインストール

4.1 新規ユーザー作成

server

[user_name| ~ ]$ sudo adduser [新規ユーザー名]
[user_name| ~ ]$ sudo passwd [新規ユーザー名]
[user_name| ~ ]$ sudo visudo
----------------------------
root ALL=(ALL) ALL
[新規ユーザー名] ALL=(ALL) ALL # この行を追加
# ↑後々 wheelか何かで管理できるとなお良い
----------------------------
[user_name| ~ ]$ sudo su - [新規ユーザー名]

4.2 VMインスタンス内の環境構築

yum -> node.js -> rbenv/ruby-build -> rubyの順

4.2.1 yum (mysql関連含む)

server
[user_name| ~ ]$ sudo yum install 
                 git make gcc-c++ patch 
                 libyaml-devel libffi-devel libicu-devel 
                 zlib-devel readline-devel mysql-server mysql-devel  -y

4.2.2 node.js

server
[user_name| ~ ]$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
[user_name| ~ ]$ sudo yum install -y nodejs

4.2.3 rbenv/ruby-build

server
[user_name| ~ ]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
[user_name| ~ ]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
[user_name| ~ ]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
[user_name| ~ ]$ source ~/.bash_profile
[user_name| ~ ]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
[user_name| ~ ]$ rbenv rehash

4.2.4 ruby

server
# centOSを選択した場合
[user_name| ~ ]$ sudo yum -y install bzip2

[user_name| ~ ]$ rbenv install -v 2.4.1
[user_name| ~ ]$ rbenv global 2.4.1
[user_name| ~ ]$ rbenv rehash
[user_name| ~ ]$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

4.3 Gitとインスタンスの紐ずけ

ssh接続 → git clone

server
[user_name@vm_name .ssh]$ ssh-keygen -t rsa
[user_name@vm_name .ssh]$ cat config 
Host github
  Hostname github.com
  User git
  IdentityFile ~/.ssh/id_rsa #<- 追加
[user_name@vm_name .ssh]$ ssh -T github
# root権限だとgit cloneできないため
[user_name| ~ ]$ sudo chown user_name www/
[user_name@vm_name www]$ pwd
/var/www
[user_name@vm_name www]$ git clone git@github.com:~~~~

4.4 Nginxを積む

server
[ユーザー名|~]$ sudo yum install nginx
[ユーザー名|~]$ cd /etc/nginx/conf.d/
[ユーザー名|~]$ sudo vi <your_app_name>.conf (小文字でもok)
# default.conf/ssl.confなどと分けるとなお良い。(細分化)

Nginxの設定は最小限です。

/etc/nginx/conf.d/your_app_name.conf
upstream unicorn {
    server  unix:/var/www/<your_app_name>/tmp/sockets/unicorn.sock;
}

server {
    listen       80;
    server_name  <ip address and/or domain name>;

    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    root /var/www/<your_app_name>/public;

    client_max_body_size 100m;
    error_page  404              /404.html;
    error_page  500 502 503 504  /500.html;
    try_files   $uri/index.html $uri @unicorn;

    location @unicorn {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn;
    }
}
server
[user_name|~]$ cd /var/lib
[user_name|lib]$ sudo chmod -R 775 nginx #パーミッション調整

4.5 Unicornの導入/設定

server
[user_name@vm_name app_name]$  vi Gemfile
---------------------
group :production do
    gem 'unicorn'
end
---------------------
# gem: command not found
[user_name@vm_name app_name]$ gem install bundler
[user_name@vm_name app_name]$ bundle install
[user_name@vm_name app_name]$ vim config/unicorn.conf.rb
/var/www/app_name/config/unicorn.conf.rb
$worker = 2
$timeout = 30
$app_dir = '/var/www/<App_name>'
$listen  = File.expand_path 'tmp/sockets/unicorn.sock', $app_dir
$pid     = File.expand_path 'tmp/pids/unicorn.pid', $app_dir
$std_log = File.expand_path 'log/unicorn.log', $app_dir
worker_processes  $worker
working_directory $app_dir
stderr_path $std_log
stdout_path $std_log
timeout $timeout
listen  $listen
pid $pid
preload_app true

before_fork do |server, _worker|
  defined?(ActiveRecord::Base) && ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      Process.kill 'QUIT', File.read(old_pid).to_i
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end
after_fork do |_server, _worker|
  defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end

4.6 CSS/JSをコンパイル

server
[user_name@vm_name app_name]$ bundle exec rake assets:precompile RAILS_ENV=production

4.7 Unicorn起動

server
[user_name@vm_name app_name]$ bundle exec unicorn_rails -c /var/www/<your_app_name>/config/unicorn.conf.rb -D -E production

4.7 Nginx再起動

server
[user_name@vm_name app_name]$ sudo service nginx reload

これで本番環境が構築できたかと思います。
エラーが出た際は、下記を参考にデバッグをすれば問題ないので、各自調べてください。

nginx   なら /var/log/nginx/error.log
unicornなら  /log/unicorn.log

AWSやVPSで普段環境構築してる人からしたら、ほとんど難しいところはないかと思います。
今後

GKE・k8sによるオートスケールの設定
Dockerによる環境開発改善・デプロイ改善
Cloud Storageによる外部ファイルサーバ利用

などをする際に、便利さを身にしみて感じるのではと思います。
では最後の投稿を楽しみにしていてください。

本番環境をGCP/AWSで何個か作り、インフラについて少しわかったこと【パフォーマンス改善編】

続きを読む

TerraformとAWSに同時入門する

GMOペパボ、ムームードメインのエンジニア@litencattです。

昨日は@dp42による、“Hello, World.”の次としてのチャットボットでした。

今日は、入社以来専らWeb開発がメインでやってきたけど、最近興味のあるAWSやTerraformによるインフラ構築について読んだ本をベースにやってみたことについて書いていきます。

やること

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版のインフラ環境や手順を参考に、AWS環境構築をTerraformを用いて行います。

なお今回はApacheなどEC2インスタンスに対する各種インストールは直接インスタンス内に入ってコマンド実行しています。

ゴール

AWS上に以下の環境構築を行ないます

  • EC2インスタンス x 2台

    • Webサーバ

      • インターネットゲートウェイを持つ
      • Apache(httpd)上でWordPressが動作している
    • DBサーバ
      • NATゲートウェイを通してインターネットに接続する
      • MySQLが起動している

具体的には以下のAWSリソースを扱います。

  • EC2
  • VPC
  • サブネット
  • ルートテーブル
  • インターネットゲートウェイ
  • セキュリティグループ
  • Elastic IP
  • NATゲートウェイ

今回参考にした本について

ネットワークにつての基礎的な用語について詳しい説明があったり、AWSで構築していく環境についての図がとてもわかりやすいのでこのあたり初めてな人にはおすすめな本だと思いました!

Terraformとは

  • AWSなど様々なサービスProviderに対して、サーバの構築・変更・管理を行うためのツール
  • HashiCorpのプロダクト
  • Enterprise版もあるみたい

ペパボではプライベートクラウドとしてOpenStackを自社運用しています。
TerraformはOpenStackにも対応しており、最近は各サービスのインフラ管理がTerraformで行われるようになってきています。

今回はこのTerraformをAWSに対して使っていきます。
https://www.terraform.io/docs/providers/aws/index.html

今回のコードのレポジトリ

https://github.com/litencatt/terraform-aws-templates

準備

Terraformのインストール(Mac)

$ brew install terraform

使用バージョン

2017/12/3の執筆時点での最新リリースバージョンをつかいます

$ terraform version
Terraform v0.11.1
+ provider.aws v1.5.0

https://github.com/hashicorp/terraform/blob/master/CHANGELOG.md#0111-november-30-2017

主にVim向け

HCL扱う場合は入れとくと便利そうです
https://github.com/hashivim/vim-hashicorp-tools

AWSの準備

terraform.tfvarsの設定

今回はAWSのアクセスキーなどの秘匿情報をterraform.tfvarsに持つようにしています。
ここに作成したアクセスキーとシークレットアクセスキーを設定してください。
リージョンなども変更したい場合は必要に応じて変更してください。

terraform.tfvars
access_key = "AWS_ACCESS_KEY"
secret_key = "AWS_SECRET_KEY"
region     = "ap-northeast-1"
key_name   = "KEY_PAIR_NAME"

:warning:実際のアクセスキーなどが書かれたterraform.tfvarsはレポジトリには登録しないよう注意ください

EC2インスタンスへのログイン時に必要な鍵ファイルについて

今回はAWSのダッシュボード上のキーペアで鍵を作成し、それをEC2インスタンス作成時に使用するように指定しています。そのため、key_nameには作成したキーペア名を設定してください。

VPC作成

まずはVPCを作成します
https://github.com/litencatt/terraform-aws-templates/pull/1

main.tf
+variable "access_key" {}
+variable "secret_key" {}
+variable "region" {}
+
+provider "aws" {
+  access_key = "${var.access_key}"
+  secret_key = "${var.secret_key}"
+  region     = "${var.region}"
+}
+
+resource "aws_vpc" "vpc-1" {
+  cidr_block = "10.0.0.0/16"
+  tags {
+    Name = "vpc-1"
+  }
+}

main.tfファイル作成後$ terraform initを実行し、AWSのpluginを取得します。

その後、$ terraform applyを実行して成功するとVPCが作成され、AWSのVPCダッシュボードのVPCページでも確認することが出来ます。
image

ちなみにv0.11.0より$ terraform applyした場合は下記のようにyesを入力しないとapplyが実行されないように変更されています。

$ terraform apply

(省略)

Plan: 15 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:

initせずにplanなどを実行した場合のエラー

$ terraform initを先に実行してください

$ terraform plan
Plugin reinitialization required. Please run "terraform init".
Reason: Could not satisfy plugin requirements.
...(略

以降の作業

すべて記事内に書くと結構なボリュームになりそうなので、以降の作業内容については各PRを参照ください。
PRを作成して手順や差分をわかりやすくし、必要に応じて説明を入れています:nerd:

WordPressページの表示確認

NATゲートウェイの作成のPR内の作業までをすべて完了後、
WebサーバのURLに対してブラウザよりアクセスするとWordPressのスタートページの表示を確認することが出来ます。
image

:warning:この記事で作成したインスタンスは既にdestroy済みなのでPR上のURLにはアクセスできませんのでご注意ください

TerraformでAWSの環境構築してみて

今後のやっていき

最後に

今回、WordPress環境をAWS上にTerraformを主に使って構築してみましたが、
こんなWordPress環境だけでなく、Node.jsやRails環境などがなんと約10秒で出来上がってしまうというロリポップ!マネージドクラウドのβ版が現在無料公開中ですので、そちらも是非宜しくお願いします:smile:
https://mc.lolipop.jp/

参考にさせて頂いたサイト

など多数

続きを読む

AWS Elastic Beanstalk に Node-RED をデプロイしてみた 2。

ここ で、公式の手順でデプロイしたけど、ちょっと気になることを手直しした。

1. アプリケーション用のディレクトリ作成

mkdir ./nodered1201
cd ./nodered1201

2. package.json 作成

vim ./package.json

name キーの値を上記で作成したディレクトリと同名にしている。

package.json
{
  "name": "nodered1201",
  "version": "1.0.0",
  "description": "node-red demo app",
  "main": "",
  "scripts": {
    "start": "./node_modules/.bin/node-red -s ./settings.js"
  },
  "engines": {
    "node": "4.x"
  },
  "dependencies": {
    "node-red": "0.17.x",
    "serialport": "2.1.x",
    "aws-sdk": "2.4.x",
    "node-red-contrib-storage-s3": "0.0.x",
    "when": "3.7.x"
  },
  "author": "",
  "license": "ISC"
}

3. settings.js 作成

vim ./settings.js

adminAuth の部分は、 ここ を参照。
下記例では、参照先と同じように、ユーザが admin 、 パスワードが password としている。

settings.js
module.exports = {
    awsRegion: 'us-east-1',
    awsS3Appname: 'nodered1201',
    storageModule: require('node-red-contrib-storage-s3'),

    uiPort: process.env.PORT || 1880,
    mqttReconnectTime: 15000,
    serialReconnectTime: 15000,
    debugMaxLength: 1000,

    adminAuth: {
        type: "credentials",
        users: [{
            username: "admin",
            password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
            permissions: "*"
        }]
    },

    functionGlobalContext: {
    },

    logging: {
        console: {
            level: "info",
            metrics: false,
            audit: false
        }
    }
}

4. config の作成

4.1. ec2 インスタンスのポート設定

Node.js 環境で立ち上がるインスタンスの待ち受けポートが 8081 らしいので、そのポートを設定する。

mkdir ./.ebextensions
vim .ebextensions/ec2.config
ec2.config
option_settings:
  aws:elasticbeanstalk:environment:process:default:
    Port: '8081'

4.2. ec2 インスタンス内のディレクトリのパーミッション設定

vim .ebextensions/00_change_npm_permissions.config
00_change_npm_permissions.config
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/00_set_tmp_permissions.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      chown -R nodejs:nodejs /tmp/.npm

下記は参考情報まで。

Node-RED で、ノードをインストールしようとすると失敗していたので、ログを見た。

npm-debug.log
verbose stack Error: EACCES: permission denied, mkdir '/tmp/.npm/node-red-contrib-aws-sdk'

確認すると、

drwxr-xr-x 329 root     root   12288 Dec  1 05:21 .npm

cfg:00_change_npm_permissions.config を作成して、あらためて確認すると下記のようになっていて、Node-RED でのノードのインストールもうまくいった。

drwxr-xr-x 337 nodejs   nodejs 12288 Dec  3 06:04 .npm

参考: Permission Error running npm install on elasticbeanstalk · Issue #4 · tomdale/fastboot-aws

5. eb コマンド実行

5.1. init で初期設定

eb init \
  --platform node.js \
  --region us-east-1

~/.aws/config が存在しないと、下記2つを聞かれるので、IAMユーザの認証情報で発行したものを、それぞれ入力する。

  • aws-access-id
  • aws-secret-key
You have not yet set up your credentials or your credentials are incorrect
You must provide your credentials.
(aws-access-id): 
(aws-secret-key): 
Application nodered1201 has been created.

5.2. create でアプリ作成

下記コマンド発行したらしばらくほっておく。
ロードバランサーは、 application じゃないとダメだと思う。Node-RED が Websocket を使っているから(←憶測あり)。
タイムアウトは、ごにょごにょ弄っている時に、タイムアウトしたので、ちょっと長めにセットした(無くてもたぶん大丈夫)。

eb create nodered1201-dev \
  --timeout 30 \
  --process \
  --elb-type application \
  --scale 1 \
  --instance_type t2.small

終わると、マネジメントコンソール上ではこんな表示が出る。

ebconsole.png

6. Node-RED にアクセスする

マネジメントコンソールで、Elastic Beanstalk を開きアプリの画面へ遷移すると、画面上部に下記のような URL が表示されているので、そのURLへアクセスする。

ebconsole2.png

Node-RED のログイン画面が表示されたら成功。 settins.js で設定した、 username と password を入力してログインする。

noderedlogin_c.png

フロー作ってデプロイしたり、ノードをインストールしてみたりする。

7. 作成された環境をチェック

7.1. EC2 をチェック

  • インスタンス

EC2_Management_Console.png

  • セキュリティグループ(下記は、キーペアを有効にした時のものなので、今回の手順だとポートは、 8081 のみになる。)

EC2_Management_Console3.png

  • ロードバランサー

EC2_Management_Console4.png

  • ターゲットグループ

EC2_Management_Console2.png

7.2. S3 をチェック

  • バケット

S3_Management_Console.png

8. 最後に

あとは、ドメインとSSLの設定だな。
直で Node-RED 使うだけならいらないけど、外からの package.json のデプロイは、試しとかなくては。(って前回も書いてるけど)

(追記)
いまさらだけど、今、目的とするものは、ロードバランシング不要、そして、ELB挟むことで、Node-REDの良さを潰してる。Network Load Blancer で MQTT 対応したとはいえ。
ELB 無しで、 をやろう。。

(追記2)
例えば、EC2インスタンスを削除した場合、インストールしたノードを無かった事にされる。ノードインストール時に更新される package.json をデプロイするか、S3に出す、運用にしないと、Beanstalk にする意味が薄れるのか。

続きを読む

ElasticStack 6.0GA がリリースされたので、もろもろのインストール方法を書いてみた

ElasticStack 6.0がGAされましたねー
てことで、ElasticStackのインストール方法について書きたいと思います( ゚Д゚)ゞビシッ

構成について

AWS上にサーバを構築してElasticStack6.0を導入します。
また、AmazonLinuxの基本的な設定は完了していることを前提とします。

  • InstanceType: t2.medium
  • OS: Amazon Linux AMI 2017.09.1 (HVM)

こんな感じの流れで書きますー

  1. Install OpenJDK 1.8
  2. Install Elasticsearch
  3. Install Kibana
  4. Install Logstash
  5. Install X-Pack in Elasticsearch
  6. Setup Password
  7. Install X-Pack in Kibana
  8. Install X-Pack in Logstash
  9. Test

参考サイト

Install Elasticsearch: Elasticsearchのインストール方法
Install Kibana: Kibanaのインストール方法
Install Logstash: Logstashのインストール方法
Install X-Pack: Elasticsearch/Kibana/LogstashのX-Packインストール方法

Install OpenJDK 1.8

$ java -version
java version "1.7.0_151"
OpenJDK Runtime Environment (amzn-2.6.11.0.74.amzn1-x86_64 u151-b00)
OpenJDK 64-Bit Server VM (build 24.151-b00, mixed mode)
$ sudo yum -y install java-1.8.0-openjdk-devel
$ sudo alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

Enter to keep the current selection[+], or type selection number: 2
$ java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

PGPキーのインポートとリポジトリ設定

### Import PGP Key
$ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
$ sudo vim /etc/yum.repos.d/elasticstack.repo
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

Install Elasticsearch

Elasticsearchをインストールし、自動起動設定を行います。

$ sudo yum install elasticsearch
### 自動起動設定
$ sudo chkconfig --add elasticsearch
$ chkconfig --list | grep elasticsearch
elasticsearch   0:off   1:off   2:on    3:on    4:on    5:on    6:off

Elasticsearchへのアクセスを制限しないため”network.host”を”0.0.0.0″とします。
もし、セキュリティ要件でアクセスを絞る必要がある場合は、任意の値で絞って頂ければと思います。

Elasticsearchの設定と動作確認

Elasticsearch.ymlに設定し、curlでレスポンスを確認します。

$ sudo vim /etc/elasticsearch/elasticsearch.yml
network.host: 0.0.0.0
$ service elasticsearch restart
Stopping elasticsearch:                                    [  OK  ]
### 動作確認
$ curl localhost:9200
{
  "name" : "5LbIuQE",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "FpDjXOQXTBOzfiY9FH8Oaw",
  "version" : {
    "number" : "6.0.0",
    "build_hash" : "8f0685b",
    "build_date" : "2017-11-10T18:41:22.859Z",
    "build_snapshot" : false,
    "lucene_version" : "7.0.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

Install Kibana

Kibanaをインストールし、自動起動設定を行います。

$ sudo yum install kibana
$ sudo chkconfig --add kibana
$ chkconfig --list | grep kibana
kibana          0:off   1:off   2:on    3:on    4:on    5:on    6:off

Kibana設定

Elasticsearch同様にKibanaへのアクセス制限はしないため、”server.host”を”0.0.0.0″とします。
あれ?フルアクセスを許可していいの?と思う方もいるかもですが、AWSで構築しているため、SecurityGroupで制限をかけている前提としています。
KibanaからアクセスするElasticsearchは、同一のサーバのためlocalhostに設定します。

$ sudo vim /etc/kibana/kibana.yml
server.host: 0.0.0.0
elasticsearch.url: "http://localhost:9200"
$ service kibana start

Install Logstah

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

$ sudo yum install logstash
### Logstashのステータス確認
$ initctl status logstash
logstash stop/waiting

Install X-Pack in Elasticsearch

ここからX-Packのインストールを実施します。
対話型で聞かれるので全て”y”とします。

$ cd /usr/share/elasticsearch/
$ bin/elasticsearch-plugin install x-pack
-> Downloading x-pack from elastic
[=================================================] 100%
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.io.FilePermission \.pipe* read,write
* java.lang.RuntimePermission accessClassInPackage.com.sun.activation.registries
* java.lang.RuntimePermission getClassLoader
* java.lang.RuntimePermission setContextClassLoader
* java.lang.RuntimePermission setFactory
* java.net.SocketPermission * connect,accept,resolve
* java.security.SecurityPermission createPolicy.JavaPolicy
* java.security.SecurityPermission getPolicy
* java.security.SecurityPermission putProviderProperty.BC
* java.security.SecurityPermission setPolicy
* java.util.PropertyPermission * read,write
* java.util.PropertyPermission sun.nio.ch.bugLevel write
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.

Continue with installation? [y/N]y
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@        WARNING: plugin forks a native controller        @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
This plugin launches a native controller that is not subject to the Java
security manager nor to system call filters.

Continue with installation? [y/N]y
Elasticsearch keystore is required by plugin [x-pack], creating...
-> Installed x-pack

Setup Password

以下、ユーザのパスワード設定を行います。
6系からはパスワード設定を行うことで認証が行えるようになります。

  • Built-in User

    • elastic
    • kibana
    • logstash_system
$ bin/x-pack/setup-passwords interactive
Initiating the setup of reserved user elastic,kibana,logstash_system passwords.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y

### 任意のパスワードを入力
Enter password for [elastic]: password
Reenter password for [elastic]: password
Enter password for [kibana]: password
Reenter password for [kibana]: password
Enter password for [logstash_system]: password
Reenter password for [logstash_system]: password
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [elastic]

Install X-Pack in Kibana

次は、KibanaにX-Packをインストールします。

$ cd /usr/share/elasticsearch/
$ bin/kibana-plugin install x-pack
Attempting to transfer from x-pack

Attempting to transfer from https://artifacts.elastic.co/downloads/kibana-plugins/x-pack/x-pack-6.0.0.zip
Transferring 120307264 bytes....................
Transfer complete
Retrieving metadata from plugin archive
Extracting plugin archive
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete

KibanaからElasticsearchへアクセスするための認証情報を設定します。

$ sudo vim /etc/kibana/kibana.yml
### 44-45行目
elasticsearch.username: "kibana"
elasticsearch.password: "passowrd"

Install X-Pack in Logstash

Logstashも同様にX-Packのインストールをします。

$ bin/logstash-plugin install x-pack
Downloading file: https://artifacts.elastic.co/downloads/logstash-plugins/x-pack/x-pack-6.0.0.zip
Downloading [=============================================================] 100%
Installing file: /tmp/studtmp-50bc41a0e0c29dab53052053c168c4c9701ba564991a07c9bc8fd22030c2/x-pack-6.0.0.zip
Install successful

LogstashからElasticsearchへアクセスするための認証情報を設定します。
logstash.ymlの末尾に記載します。

$ sudo vim /etc/logstash/logstash.yml
xpack.monitoring.elasticsearch.url: "http://localhost:9200"
xpack.monitoring.elasticsearch.username: "logstash_system"
xpack.monitoring.elasticsearch.password: "password"

Test

Monitoringされていることを確認するため、テストでLogstashからElasticsearchに対してデータを格納します。

### テストデータ作成
$ sudo vim /etc/logstash/test.log
test
### configファイル作成
$ sudo vim /etc/logstash/conf.d/test.conf
input {
  file{
    path => "/etc/logstash/test.log"
    start_position => "beginning"
  }
}
output {
  elasticsearch {
    hosts => "localhost"
    user => "elastic"
    password => "password"
  }
}
### Logstashの起動
$ initctl start logstash

Kibanaで確認

Kibanaにアクセスして確認します。
(SecurityGroupが空いていることを前提)

インデクシングされていることを”Dev Tools”で確認します。
以下のコマンドを実行し、インデクシングされていることが確認できますねヽ(*゚д゚)ノ

  • GET _cat/indices/

monitoring02.png

Monitoringをクリックし、以下の画面が表示されているかと思います。
もし、インデクシングされているのに表示されていない場合は、Time Rangeの確認をお願いします。

monitoring01.png

これにてElasticStack環境の構築は完了です。
ありがとうございましたー

捕捉

X-Packは、Trial版でインストールされているので、継続的にMonitoringを使用したい場合は、Basicライセンスの登録をお願いします(Monitoring以外は、有償版のライセンスが必要)
また、ライセンスを適用する際は、Securityを無効化してからライセンスファイルの更新作業を行ってください。

続きを読む

AWSのECSでGPUを使う方法

はじめに

AWSのECSでGPUを使う場合、ECS側ではGPU搭載のインスタンスはデフォルトでは選べません。今のところ自分自身でどうにかするしかありません。その方法を記載します。

1. ECSでクラスターを作成

ECSで新規にクラスターを作成します。ここで設定するクラスター名は後ほど使います。今回の説明ではecs-clusterという名前で説明します。

2. ECSで動かせるGPUのAMIを作成する

AWSの公式ページにあるので、こちらの手順に沿ってAMIの作成まで行います。
GPUワークロードのAMIの作成
こちらの手順の最後にec2-userでsudoをつけずにDockerを叩けるように設定しておくと構築時に便利になります。

$ sudo usermod -g docker ec2-user
$ sudo /etc/init.d/docker restart

上記のコマンド入力後は一度ターミナルから抜けて再接続する必要があります。

3. 作成したGPUのAMIを使ってインスタンス作成

インスタンスの設定

ここではp2.xlargeを使って、インスタンスを立ち上げます。

スクリーンショット 2017-11-17 17.04.37.png

以下の点に注意する必要があります

  • 作成するインスタンスのロール設定はECSインスタンスロールを与えてください。
    作成方法はこちらを参照ください:Amazon ECSインスタンスロール

  • インスタンスの設定タブの下部の高度な詳細でユーザデータを設定する(下記)

#!/bin/bash
echo ECS_CLUSTER=ecs-cluster >> /etc/ecs/ecs.config

4. Dockerfileの構築

ここではGPUを使うためのDockerfileを作り、ECRへプッシュします。
今回はtensorflow-gpu 1.4.0を使います。TensorFlowのバージョンに合わせて、nvidiaのイメージを使いますので、下記のURLからご確認ください。
https://www.tensorflow.org/install/install_sources#common_installation_problems

上記のURLで確認するとcuDNN:6 CUDA:8なのでnvidiaのimageはこのバージョンに沿ったものを使います。

下記のDockerfileは一例なので、各自行いたい構築を設定してください。

Dockerfile
FROM nvidia/cuda:8.0-cudnn6-devel
RUN apt-get update
RUN apt-get install -y  git 
                        vim 
                        build-essential 
                        libncursesw5-dev 
                        libgdbm-dev 
                        libc6-dev 
                        zlib1g-dev 
                        libsqlite3-dev 
                        tk-dev 
                        libssl-dev 
                        openssl 
                        libbz2-dev 
                        libreadline-dev 
                        checkinstall 
                        wget 
                        jq

RUN git clone https://github.com/yyuu/pyenv.git /root/.pyenv

ENV PYENV_ROOT "/root/.pyenv"
ENV PATH "$PYENV_ROOT/bin:$PATH"
ENV PATH "$PYENV_ROOT/shims:$PATH"
RUN pyenv install 3.6.2
RUN pyenv global 3.6.2
RUN pip install tensorflow-gpu==1.4.0

DockerFileを作成したら、ECRへプッシュします。
ECSのリポジトリで新規リポジトリを作成するとプッシュまでの流れが記載されているのでその通りに行います。

個人的にハマった点
tensorflowとtensorflow-gpuは一緒に入れないでください、tensorflowを入れるとCPUで動きます。必ずtensorflow-gpuだけにしてください。

5. タスク定義

ここで重要な部分は下記です。

  • 特権付与をつける
  • ボリュームマウントでホスト側のnvidia関連をマウントする
    ホスト側の「/var/lib/nvidia-docker/volumes/nvidia_driver/latest」とコンテナ側の「/usr/local/nvidia」

以上のことを行えば、ECSでGPUインスタンスを使えて、かつTensorFlowが回せると思います。

続きを読む

AWS linux PHP apache mysql wordpress 環境構築

Step1
EC2インスタンス作成

1.png

Step2
TaraTerm使って、linuxサーバ接続する

2.jpg

Step3
yum 更新
$ sudo yum -y update

4.jpg
5.jpg

Step4
Apache2.4インストール

//バージョン確認
$ sudo yum list available | grep httpd

8.jpg

//httpd24インストールする
$ sudo yum -y install httpd24

6.jpg
7.jpg

//結果確認
$ sudo yum list installed | grep httpd24

9.jpg

Step5
PHP7.0インストールする

//バージョン確認
$ sudo yum list available | grep php70
//インストールする
$ sudo yum -y install php70 php70-mbstring php70-pdo
//結果確認
$ sudo yum list installed | grep php70

10.jpg
11.jpg
12.jpg

Step6
mysqlインストールする

//mysql バージョン確認
//mysql インストールする
//結果確認
$ sudo yum list available | grep mysql57
$ sudo yum install mysql57
$ sudo yum list installed | grep mysql

20.jpg21.jpg
22.jpg

Step7
apache配置

etc/httpd/con/httpd.confを編集し、以下の2行を追加
(編集する前はhttpd.confバックアップする)
AddType application/x-httpd-php .html .htm .php .phtml
AddType application/x-httpd-php-source .html .htm .phps

・httpd.confバックアップする
$ sudo cp httpd.conf httpd.conf.bak

23.jpg

・httpd.conf編集する
$ vim httpd.conf

24.jpg

・AddTypeのところで下記二行追加
AddType application/x-httpd-php .html .htm .php .phtml
AddType application/x-httpd-php-source .html .htm .phps

25.jpg

・httpd restart
$ sudo service httpd restart

26.jpg

・確認する
var/www/htmlの下でindex.php を作成、下記のコードを追加
<?php
phpinfo();
?>
ブローザにIP入力、下記の画面出ます

28.jpg

Step8
mysql配置

・mysql起動する時、エラー発生しました。
改正:$ sudo yum install mysql57-server

29.jpg

・mysql 起動する
$ sudo service mysqld start

30.jpg

・mysql 登録する

31.jpg

・ユーザ追加
ユーザ名:mysql
パスワード:mysql
mysql> CREATE USER ‘mysql’@’localhost’ IDENTIFIED BY ‘mysql’;

32.jpg
33.jpg

Step9
wordpess配置

・下記のurlから日本語wordpessダウンロードする
https://ja.wordpress.org/install/

var/www/html下に
$ sudo wget https://ja.wordpress.org/wordpress-4.8.3-ja.zip

36.jpg

・解凍する

37.jpg

38.jpg

・エラー発生した
39.jpg

・原因:PHPにmysqlサポート追加されない。

・改正:
$ sudo yum -y install php70-mysqlnd
/etc/php.ini に extension=msql.so 追加

40.jpg
41.jpg

・設定画面が出ます
43.jpg

Step10
wordpess設定

・rootユーザにdatabaseを追加
mysql> create database wordpress;

・rootユーザパスワード修正
$ sudo service mysqld stop

$ sudo mysqld_safe –skip-grant-tables

mysql>update mysql.user set authentication_string=password(‘root’) where user=’root’;

45.jpg

・wordpessに情報記入
46.jpg

47.jpg

wp-config.php作成
$ cd var/www/html/wordpress

48.jpg

・情報記入
49.jpg
50.jpg
51.jpg

ここまで、以上になります。

追記:
FTP使いたくない場合下記参照

・wp-config.php に書きます
define(‘FS_METHOD’, ‘direct’);
・wordpressフォルダすべてのファイル書き可能に変更
sudo chmod 777 * -R

続きを読む