2016年3月23日水曜日

Amazon Linux AMI 2016.03 のリリースノートをみてちょっといいなっておもった

Amazon Linux AMI 2016.03 が、3月22日付けでリリースされました。

Amazon Linux AMI 2016.03 Release Notes
Amazon Linux AMI 2016.03 Packages

リリースノートを見ていて以下の記載におっとおもった。

"NUMA balancing disabled by default"

普通の人はほとんど気にしないと思うんだけれど、微妙にマニアックなチューニング感がとても気になった。

NUMA

NUMA は プロセッサ とメモリの接続方式のこと。従来の方式ではプロセッサとメモリは一つのメモリコントローラ経由で接続されていた。ところが搭載されているプロセッサの数が多くなると、一つのメモリコントローラへ複数のプロセッサからのアクセスが集中し、ボトルネックになってくる。しょうがないので、プロセッサ単位でメモリを接続してしまえばいいのでは?と考えたひとがいる。
これで無事解決かっていうとそうでもなくて、プロセッサに直接つながっているメモリのアクセスは早くなるけれど、ほかのプロセッサに接続されているメモリへのアクセスが遅くなるという問題が発生する。それでも各プロセスがアクセスするデータは多くの場合、局所性が働くので全体としては大体早くなるはず!ということになっている。

NUMA balancing

当然そういった機構に関して、OS のサポートが必要になる。たとえば、同じプロセッサにアクセスするようにプロセスをスケジューリングするとか、メモリの割り当てをNUMA を考慮して、どこに割り当てるかとか、時々メモリの割り当て状況を見直すとか、結構いろいろなことが発生する。

こうした処理が追加されるので、OSの処理に若干のオーバーヘッドが発生する。なので sysctl を通じて、オフオンができるようになっている。

オフにする場合
# echo 0 > /proc/sys/kernel/numa_balancing

オンにする場合
# echo 1 > /proc/sys/kernel/numa_balancing

仮想化されている場合、CPU が PIN されてなければ実際はハイパーバイザでゲストに割り当てるCPUをスケジュールを決めるので、あまりゲスト側でNUMAを意識してもしょうがないのかな?という気もする。
それにオーバーヘッドがあるといっても通常はわずかなので、ほとんどの場合気にならないレベルなのだろうけど、AWS ぐらいあほみたいにコンピューティングユニット抱えていると電気代とか、ちりつもで結構馬鹿にならないのかもしれないとも思う。

とはいえ、比較的おおきなインスタンスでは、NUMA balancing を ON にしたほうが、効率的な場合もあって、実際に以下のインスタンスでは、有効にしたほうがいいようだ。


  • cr1.8xlarge
  • c3.8xlarge
  • r3.8xlarge
  • i2.8xlarge
  • c4.8xlarge
  • d2.8xlarge
  • g2.8xlarge
  • m4.10xlarge

有効にするには以下のコマンドラインを実行するように記載がある。

$ sudo sysctl -w 'kernel.numa_balancing=1'
$ echo 'kernel.numa_balancing = 1' | sudo tee /etc/sysctl.d/50-numa-balancing.conf


参考
「仮想化のチューニングと最適化ガイド」
  8.3. NUMA の自動負荷分散
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Virtualization_Tuning_and_Optimization_Guide/sect-Virtualization_Tuning_Optimization_Guide-NUMA-Auto_NUMA_Balancing.html

wikipedia の NUMA に関する項目
https://ja.wikipedia.org/wiki/NUMA

2015年8月18日火曜日

5 step で Chef Server 12 を構築する手順

以下の URL に記載がある手順に従って Chef Server 12 を構築する。
https://docs.chef.io/install_server.html

※ AWS で構築する場合は、t2.micro だとメモリ不足で起動しない。

1. packagecloud からリポジトリ設定のインポート


curl -s https://packagecloud.io/install/repositories/chef/stable/script.rpm.sh | sudo bash

2. chef-server-core パッケージのインストール

sudo yum install -y chef-server-core
   ...(snip)...
Installed:
  chef-server-core.x86_64 0:12.1.2-1.el6

Complete!

3. 以下のコマンドを実行して、各種サービスを開始

sudo chef-server-ctl reconfigure
..... たくさんメッセージが出力される。
いろいろなレシピが実行されるので結構時間がかかる。
 

4. 最初 chef-server ユーザーの作成

書式は以下の通り
chef-server-ctl user-create <ユーザ名> <名> <姓> <メールアドレス> <パスワード> --filename <RSA Private Key を保存するファイル名>
<実行例>
sudo chef-server-ctl user-create t_suzuki taro suzuki t_suzuki@example.com xxsecretxx --filename t_suzuki_chef.key

作成された、プライベートキーはワークステーションからのアクセスに
使用されるので別途保管しておく

登録されているユーザーの一覧は user-list サブコマンドで表示する。
$ sudo chef-server-ctl user-list
pivotal
t_suzuki

登録されているユーザーの詳細は user-show サブコマンドで表示する。
$ sudo chef-server-ctl user-show t_suzuki
display_name: taro suzuki
email:        t_suzuki@example.com
first_name:   taro
last_name:    suzuki
middle_name:
public_key:   -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsgYZbeuev/FzT+kI9iqE
7ORU/w8BpZa33tOXs+bafFUhaMYslnVZ5azMbZSRBgobOdTX5Gn/qRUrVQw1czxC
TXx+0tDe68T88McnOFdRjEUTPF1WZh7x1QSgUXSeC1c0388UrdQbFXCcEi8AnPdk
P/YdpzMjJdOkZPFiJpUVZlbUyVs/TLMe5LbvU40x/LJ/8W3kWlHd42ixIjmEC6Ba
k1DkP9FIs9gvUQINgQRLvZK8XWF2AmnF1ew0Sgui5kDWja0VbSecKTW+1XgJib1y
ifxD08qgRTZQBNkog0mqBf5jeXN5dZgqbiKABZ6vPmQxHTZc8fywajj1TH+sOzNj
gQIDAQAB
-----END PUBLIC KEY-----

5. 最初の組織(会社やグループなど)の作成


書式は以下の通り
sudo chef-server-ctl org-create <組織の略称> "<組織のフルネーム>" --association_user <組織に関連付けるユーザ> --filename <RSA秘密鍵を保存するファイル>

実行例
sudo chef-server-ctl org-create example "example inc.," --association_user t_suzuki --filename example-validator.key

登録されている組織の一覧は org-list サブコマンドで表示する
$ sudo chef-server-ctl org-list
example

登録されている組織の詳細は org-show サブコマンドで表示する

$ sudo chef-server-ctl org-show example
full_name: example
guid:      56000f67fc6ce0626817b709ba191895
name:      example

これで最低限動作するはず。

2015年8月17日月曜日

chef 12 server のインストール で混乱したのでメモを残しておく

以下の公式サイトからダウンロードしようとすると、何か登録しないといけないようだが キャンセルしてもダウンロードはできてしまうので、登録は必須ではないらしい。
https://downloads.chef.io/chef-server/

配布自体は package cloud 経由で行われている。
https://packagecloud.io/chef/stable/install

以下のMLスレッドにある記事を見ると今後こっちが主流になるらしい。
http://lists.opscode.com/sympa/arc/chef/2014-12/msg00193.html


sha1 の結果は一緒だったので、簡単な方を選ぶ。
上記 packagecloud のインストラクションに従い以下のコマンドを実行する。

curl -s https://packagecloud.io/install/repositories/chef/stable/script.rpm.sh | sudo bash

実行すると、/etc/yum.repos.d/ 配下に chef_stable.repo というファイルが 作成され、普通に yum でインストールできるようになる。
438 MB と結構でかいので少しインストールに時間がかかる。

$ sudo yum install chef-server-core
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/latest                                                                                                                               | 2.1 kB     00:00
amzn-updates/latest                                                                                                                            | 2.3 kB     00:00
Resolving Dependencies
--> Running transaction check
---> Package chef-server-core.x86_64 0:12.1.2-1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

======================================================================================================================================================================
 Package                                     Arch                              Version                                   Repository                              Size
======================================================================================================================================================================
Installing:
 chef-server-core                            x86_64                            12.1.2-1.el6                              chef_stable                            438 M

Transaction Summary
======================================================================================================================================================================
Install  1 Package

Total download size: 438 M
Installed size: 1.2 G
Is this ok [y/d/N]: y
Downloading packages:
chef-server-core-12.1.2-1.el6.x86_64.rpm                                                                                                       | 438 MB     00:40
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : chef-server-core-12.1.2-1.el6.x86_64                                                                                                               1/1
  Verifying  : chef-server-core-12.1.2-1.el6.x86_64                                                                                                               1/1

Installed:
  chef-server-core.x86_64 0:12.1.2-1.el6

Complete!

ちなみに yum search すると、chef-server と chef-server-core の二つが 表示されて、非常にややこしい。chef-server の方は以下のパッケージが インストールされる。

chef-server-11.1.7-1.el6.x86_64.rpm

こっちは chef 11 のサーバーなので要注意。他に以下のパッケージも 11 ってバージョンがついている。

chef-container-11.16.2-1.x86_64.rpm
private-chef-11.3.2-1.el6.x86_64.rpm

2015.8.18 追記
ちなみにこのリポジトリから取得できるパッケージは以下のとおりでした。
$ yum --disablerepo=* --enablerepo=chef_stable list available
Loaded plugins: priorities, update-motd, upgrade-helper
Available Packages
chef.x86_64                                         12.4.1-1.el6                                            chef_stable
chef-container.x86_64                               11.16.2-1                                               chef_stable
chef-ha.x86_64                                      1.0.0_rc.3-1                                            chef_stable
chef-marketplace.x86_64                             0.0.1-1.el6                                             chef_stable
chef-server.x86_64                                  11.1.7-1.el6                                            chef_stable
chef-server-core.x86_64                             12.1.2-1.el6                                            chef_stable
chef-sync.x86_64                                    1.0.0~rc.6-1.el5                                        chef_stable
chefdk.x86_64                                       0.7.0-1.el6                                             chef_stable
delivery.x86_64                                     0.3.210-1.el6                                           chef_stable
delivery-cli.x86_64                                 20150811030818+20150811030818-1.el6                     chef_stable
opscode-analytics.x86_64                            1.1.5-1.el6                                             chef_stable
opscode-manage.x86_64                               1.21.0-1.el6                                            chef_stable
opscode-push-jobs-client.x86_64                     1.1.5-1.el6                                             chef_stable
opscode-push-jobs-server.x86_64                     1.1.6-1                                                 chef_stable
opscode-reporting.x86_64                            1.5.1-1.el6                                             chef_stable
private-chef.x86_64                                 11.3.2-1.el6                                            chef_stable
supermarket.x86_64                                  2.0.0~alpha.0-1.el6                                     chef_stable

2015年7月21日火曜日

ほとんど何もないところから無理やり、S3 にでっかいファイルをアップロードしたメモ

gzip -c < verybigfile | split -b 100m -d -a 3 - verybigfile.gz.
for FF in verybigfile.gz.* ; do ./s3up.sh $FF ; done

$ cat s3up.sh
────────────────────────────────────
#!/bin/bash
file=$1
bucket=shellupload
resource="/${bucket}/${file}"
contentType="application/octet-stream"
dateValue=`date -R`
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
s3Key=XXXXXXXXXXXXXXXXXXXXXXXX
s3Secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -v -L -X PUT -T "${file}" \
  -H "Host: ${bucket}.s3.amazonaws.com" \
  -H "Date: ${dateValue}" \
  -H "Content-Type: ${contentType}" \
  -H "Authorization: AWS ${s3Key}:${signature}" \
  https://${bucket}.s3.amazonaws.com/${file}
────────────────────────────────────

このシェルをどこから拾ったか忘れた。しくしく
多分ここからこぴって、適当になおした。

2015年6月19日金曜日

Amazon Elastic File System (EFS) を気づいたら使えるようになっていたので、早速起動してみた。

Amazon Elastic File System (EFS) を気づいたら使えるようになっていたので、早速起動してみた。 とりあえず起動してみただけなので、とりあえずファーストレビュー。

EFS は AWS が提供する、NFS v4 サーバ。ディスク容量が自動的に割り当てられるのと、サーバ自体がスケーラブルになっているとの触れ込み。

これまで、NFS のサイジングやディスク容量の管理に悩まされていたシステム管理者にとってまさにこれだけのために、AWSに移行したくなる素晴らしいソリューション。

また s3fs  の遅さやパーミッション設定の難しさに悩んでいた人にも朗報となるだろう。しかも料金はディスクを使用している分だけ。無駄にストレージに投資することもない。

マネージメントコンソールからEFSのアイコンをクリック。プレビューの申請が通っていないと申し込み画面に飛ばされる。現在は us-west-2 (Oregon) のみ使えるようになっていた。


クリックすると最初の案内画面に飛ばされる。迷わず "Create File System" をクリック。


VPC 、Subnet 、Security Group を AZ 毎に指定。実運用に回すときは、NACL や Security Group の設計に配慮が必要になるだろう。


IP アドレスは自分で指定することも自動的に割り当てることも可能。VPC 内なのでそれほどアドレスにこだわる必要もないと思うので、自動割り当て。可用性等を考慮するとどの道、DNS名での指定が有効だと思われる。



次はタグ付け。とりあえず Name タグだけつけておく。


最後に確認画面。特に変更がなければ "Create File System" をクリックして作成完了。

これで完了。



非常に簡単に高性能で可用性が高い共有ファイルシステムが使えるようになりました。

とは言え、万能の道具は無いのでいくつか注意事項はあると思います。
特にNFS 上の単一ファイルへの書き込み時排他制御には十分注意が必要です。

マニュアルにも明示的にロックの制限が記載されています。
詳細はマニュアルを確認していただくとして、ロックに関しては以下の制限があります。
  • 一つのファイルに対して、すべてのファイルシステムのユーザーに対して87 までしかロックがかけられません。複数のサーバにまたがっても87までです。
また Linux NFSv4 の制限として以下があります。
  • 一インスタンス当たり同時に128ユーザまでしか、ファイルを同時にオープンできません。
  • 一インスタンス当たり 32,768 ファイルまでしか同時にファイルを開けません。
  • 一マウント当たり、8192 ロックまでしか獲得できません。
  • 一マウント当たりユニークなファイルとプロセスの組み合わせは、256までです。例えば 1 プロセスならば、256ファイルのロックを取得できますが、8プロセスなら 32ファイルまでのロックを獲得できません。
まぁもともと NFS のロックはあてにしてはいけない(いつの話だよw)っていう話もありますし、同時実行性能の観点からはできるだけロックレスな構成にする必要もあります。

とは言え EFS の登場で、これまで オンプレから移行しづらかった案件やスケーラビリティに問題があったシステムでも、容易に拡張可能になるのではないでしょうか。



2015年1月9日金曜日

EC2スポットインスタンスのターミネート通知機能が利用できるようになったので、ちょっと試してみた。

AWS EC2 にはスポットインスタンスというちょっと変わった利用方法があります。
インスタンス起動時に価格を指定して起動することができます。通常オンデマンドより大幅に安い値段でインスタンスを起動できますが、スポット価格が指定した価格を上回った場合、突然インスタンスが停止してしまいます。

安く使えるのでいいのですが、突然止まってしまってあ゛っ!!!てなることがあります。そういう声も多いのか、インスタンスの停止を予告する機能が追加されました。

【AWS発表】EC2スポットインスタンスのターミネート通知機能

多分以下のような使い方をするのではないでしょうか?以下の例では、通知を受けたら自身のスナップショットを作成しています。他の使い方もあるかもしれません。

#!/bin/bash

#You Need Set Proper IAM Role
#GET REGION
REGION=`curl -s -f  http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//g'`

#Instance ID
InstanceID=`curl -s -f  http://169.254.169.254/latest/meta-data/instance-id`

#wait until the "temination-time" available
until curl -s -f  http://169.254.169.254/latest/meta-data/spot/termination-time
do
  sleep 5
done

#Warning all
wall "!!!!!!!!!!spot instance termination begin!!!!!!!!!"

#Wait a while for saving data etc.
sleep 30

#GET EBS
EBS=`aws ec2 describe-instances --region=${REGION} --output text --instance ${InstanceID} | awk '/^EBS/{print $5}'`

#GET snapshots
for II in $EBS ; do
  #the voodoo magic
  sync; sync; sync;
  aws ec2 create-snapshot --volume-id $II --region $REGION
done

2014年11月30日日曜日

AWS KMS が使えるのに気付いたので、早速試してみたメモ

re:invent で発表された、AWS Key Management Service が使えるようになっているのに気付いたので、早速使ってみることにしました。
このサービスは管理的には非常に重要でキーを安全に共有したいとか、キーがどれだっけ?とか、緊急の対処が必要なのにキーが見つからないとか、そういう状況に陥らないようにするために、こう言ったサービスが非常に重要だったりします。
サポートされているリージョンは以下の通りです。東京でも使えますね。

http://docs.aws.amazon.com/kms/latest/developerguide/regions.html

Region NameRegionEndpointProtocolSupport Date
US East (Northern Virginia) Regionus-east-1kms.us-east-1.amazonaws.comHTTPS11/12/2014
US West (Northern California) Regionus-west-1kms.us-west-1.amazonaws.comHTTPS11/12/2014
US West (Oregon) Regionus-west-2kms.us-west-2.amazonaws.comHTTPS11/12/2014
EU (Ireland) Regioneu-west-1kms.eu-west-1.amazonaws.comHTTPS11/12/2014
EU (Frankfurt) Regioneu-central-1kms.eu-central-1.amazonaws.comHTTPS11/12/2014
Asia Pacific (Singapore) Regionap-southeast-1kms.ap-southeast-1.amazonaws.comHTTPS11/12/2014
Asia Pacific (Sydney) Regionap-southeast-2kms.ap-southeast-2.amazonaws.comHTTPS11/12/2014
Asia Pacific (Tokyo) Regionap-northeast-1kms.ap-northeast-1.amazonaws.comHTTPS11/12/2014
South America (Sao Paulo) Regionsa-east-1kms.sa-east-1.amazonaws.comHTTPS11/12/2014

対応しているサービスは以下の通りです。

  • Amazon Redshift
  • Amazon Simple Storage Service
  • Amazon Elastic Block Store

データストアとして使うサービスで暗号化がサポートされているサービスは全て使えるようです。個人的な趣味としては、RDSのEBSでつかえるのかなぁというのが気になります。

それでは、早速、使ってみたいと思います。単独のサービスとしては、management console には表示されません。 IAM のメニューの一つとして、あります。
早速 Getting Started Now してみましょう。
なんだかわからないキーがポツンと一つだけあります。クリックしてみると、”Default master key that protects my EBS volumes when no other key is defined” とあるので、EBSを暗号化するときに利用する、デフォルトのキーのようです。EBS暗号化をすでに利用している人はうっかり消さないようにしましょう。実際 management console 上では消せないようにガードされているようです。


よく考えずに、Create Key してみます。


エイリアスを入力しなければいけないようなので、とりあえず適当な名前を入力します。


IAMユーザーの選択を求められたので、汎用に使っている adminitorator 権限(ようするに制限なし)のユーザーを選択しました。


もう一回 IAM ユーザーの選択を求められます。よく読むと、キーの管理者とキーの利用者を別に設定できるようです。これはセキュリティ的によく考えられた設計だと思います。でもここでは同じユーザーを選択しました。よろしくないですね。

こんな感じでキーのポリシーが作成されました。キーの管理者権限と、使用者権限が別に設定されています。
次に進むとこんな感じで、キーが作成されています。初期で作成されたキーは洗濯できなくて、新しく作成されたキーば選択可能になっています。キーの削除も可能なようです。


クリックするとこんな感じの画面になって、キーの管理者と使用者を指定できるようになっています。


キー自体をアップロードしたり、ダウンロードしたりはできないようです。

実際どのようなユースケースが想定されるでしょうか。

例えば、研究開発部門で極秘のプロジェクトが進行していて、同社内でも他部門には知られたくない研究データがあったとします。もちろ他社の産業スパイなどにも注意が必要です。そのデータはEBSに格納されています。KMSを利用して、権限を限定して、かつEBS暗号化を利用することで、同社内でもデータを利用することを制限することが可能です。
人事データや給与データなども該当するかもしれません。

もっと簡単なユースケースでは、例えば18禁ビデオと、それ以外でアクセス可能な権限を分けるとかw

何れにしてもセキュリティ管理的には重要な機能が追加されたと思います。