fc2ブログ

2014-03-22(Sat)

Chefを使ってみる No1(Install)

インフラの構成管理で便利なChefをスタンドアロンで構築してみる。
Chefは「Infrastructure as Code」、「べき等性」という概念があり
サーバーの構成をコード管理する。
サーバーを何回構築しても同じものができる。
という特徴がある。

Chefの構成は以下のようになっているらしい。

インストール方法はここに記載されている。
今回はスタンドアロンで勉強していく。
スタンドアロンの場合はchef-soloを使うようだ。

Chefのクライアントもサーバーココに記載されているスクリプトをコピペする。
クライアント側
chef client
chef serverにアクセスするもの。

$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
......
Thank you for installing Chef!


バージョン確認

$ chef-client -v
Chef: 11.10.4



サーバー

$ wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chef-server_11.0.11-1.ubuntu.12.04_amd64.deb
$ sudo dpkg -i chef-server_11.0.11-1.ubuntu.12.04_amd64.deb
$ sudo chef-server-ctl reconfigure


設定する。ここが参考になる。
サーバーへアクセスする。
 https://localhost:443
②ログイン画面では右端に初期adminとパスワードが記載されているので
 それを使ってログインする。
③パスワードを変更する。
④初回しか表示されないprivate key, public keyをコピーしておく。
⑤/opt/chef-server/admin.pemへprivate keyを記載
⑥/opt/chef-server/chef-validator.pemへpublic keyを記載

<リポジトリ作成>
ココが参考になる。

$ cd ~/
$ git clone git://github.com/opscode/chef-repo.git



Knife設定
ここで先ほどのadmin.pem, chef-validator.pemを使う。
$ knife configure -i

Where should I put the config file? [/home/keisuke/.chef/knife.rb]
Please enter the chef server URL: [https://gabriel:443]
Please enter a name for the new user: [keisuke]
Please enter the existing admin name: [admin]
Please enter the location of the existing admin's private key: [/etc/chef-server/admin.pem] /opt/chef-server/admin.pem
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] /opt/chef-server/chef-validator.pem
Please enter the path to a chef repository (or leave blank):
Creating initial API user...
Please enter a password for the new user:
Created user[keisuke]
Configuration file written to /home/keisuke/.chef/knife.rb



Opscode Community
サーバー構築自動化ツール Chef 最新版のインストール方法
ChefDocument chef-solo
knife-soloによるChefの実行
スポンサーサイト



2012-04-29(Sun)

IAMのAccess Policy Languageをいじる(1)

Amazon AWSでIAM(Identity and Access Management)を使うと
アカウント制限を細かく制御できるらしいという噂を聞いたので
使ってみた。
一番ややこしかったのがAccess Policy Languageだったのでメモる。
Access Policy Languageは基本JSONフォーマットになっている。
Access Policy LanguageにはGroup側とUser側と2種類ある。

どちらで設定しても反映するが以下の条件がある。
(Effelct設定条件)
①DefaultはDeny(拒否)である。
②明示的Deny優先である。

つまり、初期値は全てDeny。
GroupでAllowを設定してもUserでDenyを設定したらDeny
GroupでDenyを設定してUserでAllowを設定してもDenyとなる。

また、カテゴリとして一番使いそうなのを設定してみる。
(条件設定カテゴリ)
①Effect -- アクセス許可、拒否の設定
②Action -- 操作の設定
③Resource -- 対象リソースの設定
④Condition -- 制御条件


(設定例)
Group側
{
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket-name/*"
}
]
}


User側
{
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": ["arn:aws:s3:::bucket-name","arn:aws:s3:::bucket-name/*","arn:aws:s3:::bucket-name/path1/*","arn:aws:s3:::bucket-name/path1/path2/*"],
"Condition" : {
"DateGreaterThan" : {
"aws:CurrentTime" : "2012-04-01T12:00:00Z"
},
"DateLessThan": {
"aws:CurrentTime" : "2013-04-01T15:00:00Z"
},
"IpAddress" : {
"aws:SourceIp" : ["192.168.11.0/32","192.168.11.1/32"]
}
}
}
]
}


Resourceでのバケットパス設定で詰まったのでメモっておく。
例えば bucket-name/path1/path2/*へのアクセスを許可するとき
"Resource":"bucket-name/path1/path2/*"
だけではNGである。
"Resource":["bucket-name", ""bucket-name/*", "bucket-name/path1/*","bucket-name/path1/path2/*"]
と順番に記載しなければダメだった。

少々めんどくさいなぁ。


参考:
S3のポリシー設定:
Condition Key設定

2012-03-16(Fri)

Amazon EC2でAMIを生成させる

Amazon EC2でAMIを生成させてみたのでメモる。

手順としては以下のとおり。
(1). 必要パッケージのインストールと設定
(2).設定
(3).イメージを分割して生成する。
 このとき、第一パーティション(10G)分しか生成されないので
 /mntにあるデータで必要なものは第一パーティションに圧縮するかなにかしてコピーしておく。
(4).S3へアップロード
 分割されたイメージファイルをS3で作ったbcuketにアップロードする。
(5).AMIへ登録する。
 AMI IDを取得していつでもInstanceをLaunchできるようにしておく。


BuketのデータはLaunchするときAMI IDから参照されるので消さないこと。


(1). Install
$ aptitude install perl
$ pwd
/mnt/download
$ curl -O http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.zip
$ curl -O http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip
$ unzip ec2-ami-tools.zip
$ unzip ec2-api-tools.zip
$ cd /usr/local
$ sudo mv /mnt/download/ec2-ami-tools-1.4.0.5 .
$ sudo mv /mnt/download/ec2-api-tools-1.5.2.4 .
$ ln -s ec2-ami-tools-1.4.0.5 ec2-ami-tools
$ ln -s ec2-api-tools-1.5.2.4 ec2-api-tools


(2). Set Environment
$ vim ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
export EC2_HOME=/usr/local/ec2-api-tools
export EC2_APITOOL_HOME=$EC2_HOME
export EC2_AMITOOL_HOME=/usr/local/ec2-ami-tools
export PATH="$PATH":$JAVA_HOME/bin
export PATH="$PATH":$EC2_HOME/bin
export PATH="$PATH":$EC2_AMITOOL_HOME/bin

export EC2_PRIVATE_KEY=$HOME/pairkey/pk-XXXXXXXXXXXXXXXXXXXXXXXXXX.pem
export EC2_SECRET=$HOME/pairkey/cert-XXXXXXXXXXXXXXXXXXXXXXXXXXX.pem
export EC2_ACCESSKEY=XXXXXXXXXXXXXXXX
export EC2_OWNER_ID=XXXX-XXXX-XXXX
export EC2_SECRET_ACCESSKEY=XXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_ACCESS_KEY_ID=$EC2_ACCESSKEY
export AWS_SECRET_ACCESS_KEY=$EC2_SECRET_ACCESSKEY

$ source ~/.bashrc

ここでJAVA_HOMEに注目する。
64bitでは
JAVA_HOME=/usr/lib/jvm/java-6-openjdk
であるが、32bitの場合は
JAVA_HOME=java-6-openjdk-i386
となる。
注意が必要。

(3). Compress
64bit Linuxを想定しているので(-r x86_64) 32bitなら (-r i386)
$ ec2-bundle-vol -d /mnt/ami --privatekey $EC2_PRIVATE_KEY --cert $EC2_CERT --user  $EC2_OWNER_ID -r x86_64


(4). Upload to S3
$ ec2-upload-bundle --bucket bucketname/large-type/20120302 --manifest ami/image.manifest.xml --access-key $EC2_ACCESSKEY --secret-key $AWS_SECRET_ACCESS_KEY


(5). registered AMI
東京リージョンを想定(--region ap-northeast-1)
$ ec2-register bucketname/large-type/20120302/image.manifest.xml -K $EC2_PRIVATE_KEY -C $EC2_CERT --region ap-northeast-1


スクリプトにしたらこんな感じだろうか。
#!/bin/sh
TODAY=`date +%Y%m%d`
MACHINE_TYPE=i386
# MACHINE_TYPE=x86_64
# REGION=ap-northeast-1
REGION=us-east
BUCKET_NAME=bs-ana-ami

# (1). compress
echo "start ec2-bundle-vol"
ec2-bundle-vol -d /mnt/ami --privatekey $EC2_PRIVATE_KEY --cert $EC2_SECRET --user $EC2_OWNER_ID -r $MACHINE_TYPE
# (2). upload
echo "start ec2-upload-bundle"
ec2-upload-bundle --bucket $BUCKET_NAME/small-type/$TODAY --manifest /mnt/ami/image.manifest.xml --access-key $EC2_ACCESSKEY --secret-k\

# (3). registered AMI
echo "start ec2-register"
ec2-register $BUCKET_NAME/small-type/$TODAY/image.manifest.xml -K $EC2_PRIVATE_KEY -C $EC2_SECRET --region $REGION


参考:
AmazonCloudテクニカルガイド ―EC2/S3からVPCまで徹底解析―
Amazon Web Services ガイドブック クラウドでWebサービスを作ろう!
クラウド Amazon EC2/S3のすべて~実践者から学ぶ設計/構築/運用ノウハウ~ (ITpro BOOKs)

2012-03-04(Sun)

Amazon EC2でElastic MapReduceを使う:起動(2)

では早速動かしてみる。
/usr/local/elastic-mapreduce$ ./elastic-mapreduce --create --stream ¥
--mapper "python s3n://bs-emr/samples/mapper.py" ¥
--reducer "python s3n://bs-emr/samples/reducer.py" ¥
--input s3n://bs-emr/samples/input/test.csv ¥
--output s3n://bs-emr/output_002 ¥
--enable-debugging
Created job flow j-3U82VYK3CEP2A

mapper, reducer, inputすべてをS3から読み込みoutputもs3へ。
デバッグモードもenableにしておくことで、AWSからログを確認することができる。

ステータスを確認。
$ ./elastic-mapreduce --list --jobflow j-3U82VYK3CEP2A
j-3U82VYK3CEP2A STARTING Development Job Flow
PENDING Setup Hadoop Debugging
PENDING Example Streaming Step

Instance起動待ちかな。

詳細状態確認
$ ./elastic-mapreduce --describe --jobflow j-3U82VYK3CEP2A

Json形式で詳細状態が見れる。長すぎるのでコピペしない。

完了するとoutputに指定したフォルダにMapReduce結果が出る。

ちなみにJobのキャンセルは以下のとおり。
$ ./elastic-mapreduce --terminate --jobflow j-3U82VYK3CEP2A


参考:
Amazon Elastic MapReduceで日本語のwordcountを試した時のメモ
アクセスログ解析システム構築事例
Can not obtain normal Output Files with EMR
クラウド Amazon EC2/S3のすべて~実践者から学ぶ設計/構築/運用ノウハウ~ (ITpro BOOKs)
Amazon Web Services ガイドブック クラウドでWebサービスを作ろう!

2012-03-03(Sat)

Amazon EC2でElastic MapReduceを使う:準備(1)





AmazonのEMRを使ってみたのでメモっておく。

- あらかじめインストールしておくもの
$ sudo aptitude install openssh-server
$ sudo aptitude install openjdk-6-jdk
$ sudo aptitude install ruby-full


- ダウンロードして設定するもの
-- S3sync設定
http://s3sync.net/wiki
$ curl -O http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz
$ tar xzvf s3sync.tar.gz
$ mv s3sync/ /usr/local/
$ sudo cp /usr/local/s3sync/s3config.yml.example /usr/local/s3sync/s3config.yml
$ sudo vim /usr/local/s3sync/s3config.yml
aws_access_key_id: 11111111 (EC2_ACCESSKEYを設定する)
aws_secret_access_key: 22222222 (EC2_SECRET_ACCESSKEYを設定する)
ssl_cert_dir: /home/user/s3sync/certs

$ vim ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
export EC2_HOME=/usr/local/ec2-api-tools
export EC2_APITOOL_HOME=$EC2_HOME
export EC2_AMITOOL_HOME=/usr/local/ec2-ami-tools
export PATH="$PATH":$JAVA_HOME/bin
export PATH="$PATH":$EC2_HOME/bin
export EC2_PRIVATE_KEY=$HOME/pairkey/pk-***.pem
export EC2_CERT=$HOME/pairkey/cert-***.pem
export EC2_ACCESSKEY=*************
export EC2_OWNER_ID=****-****-****
export EC2_SECRET_ACCESSKEY=************************************
export AWS_ACCESS_KEY_ID=$EC2_ACCESSKEY
export AWS_SECRET_ACCESS_KEY=$EC2_SECRET_ACCESSKEY

EMR_HOME=/usr/local/elastic-mapreduce
export PATH="$PATH":$EMR_HOME

S3SYNC_HOME=/usr/local/s3sync
export PATH="$PATH":$S3SYNC_HOME
export AWS_CALLING_FORMAT="SUBDOMAIN"

(反映)
$ source ~/.bashrc
(動作確認)
$ /usr/local/s3sync$ s3cmd.rb list bucketname:


-- elastic-mapreduce設定
$ sudo mkdir /usr/local/elastic-mapreduce
$ cd /usr/local/elastic-mapreduce
$ curl -O http://elasticmapreduce.s3.amazonaws.com/elastic-mapreduce-ruby.zip
$ unzip elastic-mapreduce-ruby.zip
$ vim /usr/local/elastic-mapreduce/credentials.json
{
"access-id": "**************", -->(Access ID)
"private-key": "*************************************************", -->(Secret ID)
"key-pair": "hadoop-master",
"key-pair-file": "/usr/local/elastic-mapreduce/hadoop-master.pem", -->(instance生成時でのpemファイル)
"log-uri": "s3://emr/samples/logs/",
"region": "ap-northeast-1"
}


- mapper, reducerを作成
mapper.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys

def main():
try:
line = sys.stdin.readline()
while line:
line = line.strip()

fields = line.split("\t")
print "%s\t%s" % (fields[0], 1)
line = sys.stdin.readline()
except Exception, e:
raise

if __name__ == "__main__":
main()

reducer.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys

cnt = {}

def main():
global cnt
line = sys.stdin.readline()
try:
while line:
line = line.strip()
key, value = line.split("\t")
if not cnt.has_key(key):
cnt[key] = 0
cnt[key] += 1
line = sys.stdin.readline()
except Exception, e:
print(e)
raise

if __name__ == "__main__":
main()
for k, v in cnt.iteritems():
print "%s\t%s" % (str(k) , str(v))


InputFileを適当に作る。(test.csvつまりcsv形式、間隔はタブ)
ディレクトリは/usr/local/elastic-mapreduce/samples/inputの下。
aa  11
bb 22
aa 13
bb 41
cc 15
dd 16
bb 27
cc 83
ee 29
dd 50
aa 21


※mapper.py reducer.pyのデバッグ方法は以下のとおり。
テスト用のログをdummy_log.txtとするとこうなる。
$ cat dummy_log.txt | python mapper.py  | python reducer.py

S3と同期開始
/usr/local/elastic-mapreduce/samplesディレクトリにmapper, reducerを作った。
これをS3へsamplesディレクトリごとアップする。
$ ruby /usr/local/s3sync/s3sync.rb -r --delete /usr/local/elastic-mapreduce/samples backetname:


参考:
Amazon EC2 MapReduce FAQ
Amazon EC2 Word Count Exzmple
クラウド Amazon EC2/S3のすべて~実践者から学ぶ設計/構築/運用ノウハウ~ (ITpro BOOKs)
Amazon Web Services ガイドブック クラウドでWebサービスを作ろう!





プロフィール

kumagonjp2

Author:kumagonjp2
Python,Django,R,Mongo,MySQL,Struts,Spring,データマイニングなどサーバー関係のメモを残していきます。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
雪が3Dで降るブログパーツ ver2

マウスで見る方向変えられます

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR