duyojiぶろぐ

技術系ときどき日常系

Amazon Linuxにsambaをyumで入れる

パッケージを追加

AWSでAmazon Linuxを選択してインスタンスを作った場合デフォルトでsambaのパッケージが無かった。 そのため以下のようにしてレポジトリを追加してsambaをインストールした。

#cd /etc/yum.repos.d/
#wget http://ftp.sernet.de/pub/samba/3.5/centos/5/sernet-samba.repo

#yum update
#yum install samba

ELASTIC LOAD BALANCERS(ELB)経由を使った場合のリクエスト元を取得する

Apacheのログフォーマットの形式についてもあまり知らなかったからログフォーマットの学習もかねてみた。

特にログフォーマットとか気にせずロードバランサー経由でも アクセス元のIPを表示したい場合は以下の参考にしたURLでも紹介している ELB配下のEC2アクセスログについてあれこれの最初に書かれている以下のコードを書けば良い。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
↓  #このように変更
LogFormat "%h %l %u %t %D \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i" combined

上記のように変更するとそれぞれのパラメータは以下のようになる。 Apache モジュール mod_log_configを参照するともっと理解できる思う

リクエストURL : http://example.com/index.php

  • %h ・・・ ELBのIPが表示される
  • %l ・・・ 「-」
  • %u ・・・ 「-」
  • %t ・・・ [15/Dec/2012:20:25:40 +0900]
  • %D ・・・リクエストを処理するのにかかった時間、マイクロ秒単位
  • %r ・・・ GET /index.php?=PHP~~(文字列) HTTP/1.1
  • %s ・・・ ステータス(例200) ( 最後のステータスは %>s )
  • %b ・・・ 「レスポンスのバイト数(例2130)」
  • %{Referer}i ・・・リクエストURL(例 : http://example.com/)
  • %{User-Agent}i ・・・ユーザーエージェント(例 : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/522.21 (KHTML, like Gecko) Chrome/23.0.1111.90)
  • %{X-Forwarded-For}i ・・・ アクセス元IP(例 : 111.11.111.11)
  • %{X-Forwarded-Proto}i ・・・ プロトコル(例 : http)

参考にしたURL

AWS Elastic Beanstalkをコマンドラインから作成してアップロードまで

AWS Elastic Beanstalkとは

Elastic Beanstalk(以下,EB)はHerokuや、phpfogのようなPaaSの一つ。

サーバーに関して知識が無くてもブラウザのGUIコンソールから
アクセスが増えたときはサーバーを増やして対応するなど設定次第で
自動でスケールアウト出来るから色々お手軽にサービスを提供できる。

EBにコマンドラインツールを使ってアップしてRailsでデプロイすることが書かれている
記事もあり、Railsでやってみたい方は以下の記事を参考にすると良いと思う。

AWS Elastic Beanstalk と Rails で Hello World してみる【11日目】


EC2インスタンスを起動してそのサーバーでサービスを提供するため
実際にsshとかでサーバーを直接いじる事も出来る。

基本的に以下のURLを一通りやれば良いだけ

http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/command-reference-get-started.html

EBは以下のように色々な言語に対応しているが今回はPHPを選択した。

しかし最初はほとんどコマンドだけで言語とかあまり関係なく
ただサーバーを立ち上げたときデフォルトでPHPの環境が出来ているだけ
だと思うので直接サーバーをいじる事が出来ればあまり気にしなくて良いと思う。
(間違っていたらごめんなさい)

実行環境

Mac OSX 10.8

必要なもの

gitとrubyに関してはXcodeなりデフォルトのrubyなり,homebrewなりで
入れれば良いと思う。それらのインストールに関しては別の記事を参考にして
入れてもらえたらと思う。

AWS Elastic Beanstalk Command Line Toolを使えるようにする

とりあえずさっきも書いたAWS Elastic Beanstalk Command Line Toolからzip形式であるAWS Elastic Beanstalk Command Line Toolをダウンロードする。

ダウンロードしたzipファイルをとりあえず適当なところに置く。
自分は「~/.aws」というディレクトリを作ってそこにzipファイルを置いて
ターミナルから以下のようにして解凍

$ unzip <ダウンロードしたファイル.zip>

解凍したあとはEBをコマンドで使えるようにするために使う「eb」コマンドまでの
パスを環境変数に保存。
ちなみに/eb/macosx/というディレクトリがあるが
ここでは/eb/linux/とlinuxディレクトリを選択した

$ export PATH=$PATH:<path to unzipped EB CLI package>/eb/linux/python2.7/


ここまでやれば「eb」コマンドが使えるようになっている。

デプロイ ~Hello, EB~を表示させる

とりあえず作業ディレクトリを作ってgitレポジトリを作る。

$ mkdir EB
$ cd EB
$ git init


ここで先ほどダウンロードして解凍したAWS DevToolsの中に入っている
AWSDevTools-RepositorySetup.shを実行する。
これはgitにaws用に拡張をつけるもので最終的にgit aws.pushでEBにpushする。

参考URL
http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/GettingStarted.GetSetup-devtools.html


EBディレクトリ

$ sh <path to unzipped EB CLI package>/AWSDevTools/Linux/AWSDevTools-RepositorySetup.sh


次にEBの環境を作る。

$ eb init

上記を行うと以下の事が対話形式で聞かれるので
自分の環境にあったもの、構築するものを選択する。

聞かれる内容

  • AWS Access Key ID
  • AWS Secret Access Key
  • Available service regions are(自分の使っているリージョン)
  • AWS Elastic Beanstalk application name(特に名前を気にしなくてよいならそのままEnterして大丈夫, ディレクトリ名がデフォルトでつく)
  • AWS Elastic Beanstalk environment name(特に名前を気にしなくてよいならそのままEnterして大丈夫, 「ディレクトリ名-env」がデフォルトでつく)
  • Available solution stacks are:(今回は64bit Amazon Linux running PHP 5.3を選択)


上記の処理を終えたら以下のコマンドを実行するとEC2インスタンスが作成されたり
色々処理が始まりデプロイされる。

$ eb start

以下のコマンドで表示されるものの中にURLがあるので、
それをブラウザに入力するとページがデフォルトで用意されているページがブラウザに表示される。

$ eb status --verbose

デフォルトで表示されるページ


index.phpでファイルを作る

<!DOCTYPE HTML>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title></title>
</head>
<body>
	<h1>Hello, <?php echo 'EB';  ?></h1>
</body>
</html>

その後git add, git commit

ファイルを作ったら以下のようにしてEBにpushして
同じページをリロードするとさっきのファイルが表示される。

$ git aws.push


cronからだと環境変数の値が期待通りに返ってこない

メモ

はじめの方に「export $PATH」的なことをやったらうまくいった


コマンドから実行するとexample.sh内で定義している
変数current_dirにはそのファイル自身(example.sh)があるディレクトリまでのパスを取得できる。

$ sh example.sh

#example.sh

current_dir=$PWD

しかしcrontab -eから実行するとrootユーザーで実行した場合
$PWDは/rootが表示される。
解決法としてdirnameコマンドを使ってファイルまでのパスを取得するようにした。
ちなみにシェルスクリプト内で自分自身のファイル名は「$0」で取得できる。

cronで実行された example.sh

#example.sh

current_dir=`dirname $0`

他にも色々と参考にした記事をみると、相対パスで色々処理したい場合cdで移動して
目的のファイルまで移動して処理するのが良いみたい。
絶対パスを使えば関係ないけど。