sakutarou’s blog

とりあえずWeb系技術をゆるく書いていく

Vagrantで使用するプロバイダを指定する

タイトル通りですが、「Vagrantで使用するプロバイダを指定する」方法の備忘録です。

Vagrantを使用してる人は「VirtualBox」を使ってる人が多いと思うので、ほとんど使うことはないでしょうか?

自分はWindows上で「Vagrant + Hyper-V」を使っているので、毎度毎度 vagrant up --provider=hyperv と入力するのがめんどくさいのです。

設定内容

環境変数VAGRANT_DEFAULT_PROVIDER を設定するだけです。
設定する値は使いたいプロバイダです。自分の場合だと hyperv ですね。

簡単!

laravel/envoyでデプロイしてみる

PHPで作られているシステムをデプロイをするために、Envoyを使ってみました。
CapistranoやRocketeerとかと似たような立ち位置のものですね。

ただこれらよりはずっとシンプルです。
簡単な機能しかないですが、シンプルなものであれば全然問題ないと思う。

Envoyはこれ↓ github.com

これって、Laravelでしか使えないの?

Laravelってついてるけど、Laravelに限らずどこで使えます。
自分はCakePHP3と組み合わせて使ってます。

Envoyインストール

composer require "laravel/envoy=~1.0"

Envoyファイルの作成

# 127.0.0.1がデプロイ先になります。
php vendor/bin/envoy init 127.0.0.1

上記コマンドを実行すると Envoy.blade.php が作成されます。
こんなやつ

// Envoy.blade.php
@servers(['web' => '127.0.0.1'])

@task('deploy')
    cd /var/www/html
    git pull origin master
@endtask

taskからendtaskの間がデプロイ先で実行するスクリプトになります。

複数サーバーにデプロイするような場合は、 @servers(['web1' => '127.0.0.1', 'web2' => '127.0.0.1']) のように単純に複数並べます。

実行してみる

deploy が実行するタスク名になります。
以下を実行すると、リモートサーバーにログインして、 /var/www/html に移動して、 git pull をする というものになります。簡単!

php vendor/bin/envoy run deploy

story

storyは、複数のタスクをまとめて実行することができる機能です。
storyに、実行したいタスク名を羅列するだけです。

@servers(['web' => '192.168.1.1'])

@story('deploy')
    git
    composer
@endstory

@task('git')
    git pull origin master
@endtask

@task('composer')
    composer install
@endtask

setup

デプロイ処理をするときに必ず初期化したいような処理を書いておくのが、 setup です。
setupは PHPで記述します

タスクでPHPの変数を使いたい場合は、{{}} で変数を囲みます。

@setup
    $date = date('Y/m/d');
@endsetup

@task('deploy'])
    echo {{$date}}
@endtask

特定のサーバーに限定してタスクを実行したい

特定のサーバーに限定する場合は、タスクのパラメーターとして、 on にサーバー名を追加します。

@servers(['web1' => '192.168.1.1', 'web2' => '192.168.1.2'])

@task('deploy', ['on' => ['web1']])
    cd site
    git pull origin master
@endtask

並列処理

基本的に処理は、1サーバーごとに実行されます。
たた、同時に実行して問題がない場合は並列でデプロイしたほうがいいかもしれません。

並列処理も簡単で、並列に処理したいタスクのパラメーターとして、 parallel をtrueに設定するだけです

@servers(['web1' => '192.168.1.1', 'web2' => '192.168.1.2'])

@task('deploy', ['parallel' => true])
    cd site
    git pull origin master
@endtask

ifやforを使いたい

使いどころがいまいち思いついてないですが、ループや分岐も使えます。
マニュアルにも載ってないので、必要ないかも?

@servers(['web1' => '192.168.1.1'])

@setup
    $list = ['one', 'two', 'three'];
@endsetup

@task('deploy')
    @foreach ($list as $user)
        @if ($user == 'aaa')
            echo {{$user}}
        @endif
    @endforeach
@endtask

終了処理

これもマニュアルに載ってない。。。
タスクごと、デプロイ自体の終了処理も書くことが可能です。

// タスクごとの終了処理
@after
    echo "タスク完了";
@endafter

// デプロイ自体の終了処理
@finished
    echo "デプロイ終了";
@endfinished

Slack通知

デプロイとは関係ないですが、Slack、Hipchatへの通知機能を持ってます。
setupやafter、finishedで使うといい感じかも

@servers(['web1' => '192.168.1.1'])

@finished
    @slack('Incoming WebHooks URL', '通知先チャンネル', 'デプロイ終わったよー')
@endfinished

DockerでAmazonLinuxを動かす

AmazonLinuxがdocker上で簡単に動かせるようになったので試してみました。

環境

  • ホストOS・・・CentOS 7
  • Docker・・・1.12.3

CentOS 6上のDocker 1.7で試したら、 image amazonlinux:latest not found と出て実行できませんでした。

AWS cliのインストール

AWS cliをすでにインストールしている場合はスキップ

インストール

yum install python-pip
pip install pip --upgrade
pip install awscli

AWS cliの設定

aws configure

# 以下は環境に合わせて
AWS Access Key ID [None]: Access Key
AWS Secret Access Key [None]: Secret Key
Default region name [None]: ap-northeast-1
Default output format [None]: json

Amazon Linuxイメージ取得

aws ecr get-login --region ap-northeast-1 --registry-ids 137112412989

# ecr get-loginを実行すると以下のようなコマンドが出力されるので、そのまま実行する
docker login -u AWS -p {パスワード} -e none https://137112412989.dkr.ecr.ap-northeast-1.amazonaws.com

# Docker Imageを取得
docker pull 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest

Amazon Linuxの起動

ここまで来たら、通常通りコンテナを起動するだけです。

docker run -it 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest /bin/bash

AmazonLinux起動してみるとわかるのですが、本当に何も入ってないです。

image名の変更

特に必要ないですがimage名を変更したほうが楽かも

docker tag {イメージID} amazonlinux
docker rmi 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux

参考

Amazon Linux Container Image - Amazon ECR

CakePHP3のメンテナンス切り替え用プラグインを作った

ホームページやシステムをすでにリリースしていて、DB等メンテナンスする場合にメンテナンス画面を表示するあれです。
どうやってみなさん画面を切り替えているのでしょうか?
.htaccessが多いのでしょうか。

今回は、メンテナンスを簡単に表示するCakePHP3のプラグインを作成しました。

github.com

インストール

composer require fusic/maintenance

使い方

使い方は簡単なので README をご確認ください。
ざっくりは以下になります。

  1. src/Application.phpMaintenanceMiddleware を追加する
  2. src/Template/Error/maintenance.ctp にメンテナンス用ctpを作成する
  3. メンテナンス画面を表示するタイミングで tmp/maintenance の空ファイルを作成する

最後に

今回初めて、 Middleware を使ったのですが、今後認証系もMiddlewareを使われるようになったりするんですかねー
使いどころをまだ思いついてない。。。
LaravelのMiddlewareを参考にしてみよう。

Serverless Framework v1 を使ってみた

Lambdaでの開発を高速化、便利にするフレームワークServerless Framework がver1.0が出たみたいなのでやっと触ってみました。
1.0が出たばかりで古い情報が多かったので自分の備忘録もかねて残しておきます。

CentOS6上に構築してます。

インストール

nodeのインストール

nodeのv4以上が必要となります。
バージョンが低い場合は入れなおしましょう。

node -v
> v4.6.1

入れなおす場合

# インストールされているnodeを削除する
yum erase nodejs

# リポジトリの追加
rpm -Uvh https://rpm.nodesource.com//pub_4.x/el/6/x86_64/nodesource-release-el6-1.noarch.rpm

# nodeのインストール
yum install nodejs

# バージョン確認
node -v
> v4.6.1

Serverless Frameworkのインストール

npm install serverless -g

serverless -v
> 1.0.3

AWS IAMの作成

AdministratorAccess権限を持ったIAMを作成します。
デプロイ時に使用するユーザーとなります。

Serverless Frameworkテンプレートの作成

適当なディレクトリで、以下のコマンドを実行して初期構築を行います。
テンプレートファイルが作成されます。

mkdir hoge
serverless create --template aws-nodejs --name hoge

template、nameには自由に設定してください。
templateは以下の好きなものを選んで問題ありません。

serverless.ymlの追記・修正

serverless.ymlには様々な設定が記述されています。
その中から、 regionaccessKeyIdsecretAccessKey を追記・修正します。

provider:
  region: ap-northeast-1

  credentials:
    accessKeyId: {{AWS IAMアクセスキー}}
    secretAccessKey: {{AWS IAMシークレットキー}}

regionは使用するリージョンを設定してください。
デフォルトだと、バージニアにデプロイされます。
credentialsについては、他にもaws-cliのcredentialsを使ったりできるみたいなのですが、手っ取り早く動かすために serverless.yml に追記してます。

デプロイ

以下、コマンドを実行することで Lambda へデプロイすることが可能です。

serverless deploy -v

実行結果として、endpointが表示されます。
endpointへブラウザからアクセスして messageに Go Serverless v1.0! Your function executed successfully! が表示されれば成功です。

次回へ続く

CakePHP3でのキャッシュの消し方

キャッシュを消してくれるコマンド出来てた。

CakePHP 3.3.0かららしい。知らなかった。
findコマンド使って削除してたので地味に便利!
使っていこう。

php bin/cake.php cache clear_all

Cache シェル

今さらすっごい便利なtigをインストールした

tigはGitをCUIで扱う場合に便利にしてくれるツールです。
git loggit add 等がカラフルで見やすく、インタラクティブに操作できるようになります。

tigの存在は知ってたのですが、ずっーーと見て見ぬ振りをしていたので使ってみました。

インストール

rpmforgeを追加すればyumでインストールすることが可能です。
MacであればHomebrewでインストール可能みたいです。

rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

vim  /etc/yum.repos.d/rpmforge.repo
- enabled = 1
+ enabled = 0

yum --enablerepo=rpmforge install tig

ただし、yumでインストール出来るのは結構古いので、自分でmakeしてもいいかも
http://jonas.nitro.dk/tig/manual.html

使い方

git clone した場所で、 tig と入力するだけです。
tig を実行すると git log した状態と同じになります。

tigを実行した画面
f:id:sakutarou:20160111221327g:plain

この状態で上下で対象のcommitを選び、エンターでdiffを見ることが出来ます。

ステータスを確認する(git status)

現在のステータスを確認するには tig status を実行します。
※tigの初期画面から S でも移動可能

f:id:sakutarou:20160111221509g:plain

基本的にはgit statusと変わりませんが、この画面上で git add , git diff , git reset , git commit を完結することが出来ます。

git add、git reset

ファイルを選択した状態で u を押す

git diff

ファイルを選択した状態で Enter を押す

git checkout --

ファイルを選択した状態で ! を押す
「Are you sure you want to revert changes?」と聞かれるので、y を押すことで変更を戻すことが可能です。

git commit

addをした状態で、C を押す

その他

~/.tigrc を修正することで細かな設定を変更することが可能です。
http://qiita.com/yoshikazusawa/items/d99e8b5d6f6a45aa6e2e
http://jonas.nitro.dk/tig/tigrc.5.html