AWSおさらい

Amazon Web Services 基礎からのネットワーク&サーバー構築」という本が出ていたので、AWSのおさらいも兼ねて読んでみる。AWSの上で、インフラ技術を学ぶという趣旨。クラウドが当たり前になって、クラウドじゃないレガシーなシステムが目の前から消えていくと(半分現実になりつつある気がするが)、近い将来にはこんなテイストのテキストが普通になるのかなと感じた。本書はAWSの入門に必要最低限のネットワーク周りの解説が載っているけど、教科書的解説+クラウドで演習といった形式でね。

さて、VPCを触るのは初めてだけど、VPCを作って、その中のインスタンスApacheを動かすところまで確認した。Tokyo regionだと、RTTは9秒強ぐらいだな。

  • 2章:ネットワークの構築(VPC
  • 3章:サーバの構築(EC2)
  • 4章:Apacheのインストール

インスタンスをstopして、続きはまた明日。

余談だけど、Amazon Linuxはちゃんとshellshock対策されてるね。

[ec2-user@ip-10-0-1-10 ~]$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
this is a test

Amazon Web Services 基礎からのネットワーク&サーバー構築

Amazon Web Services 基礎からのネットワーク&サーバー構築

「Virtualを仮想と誤訳した責任は我々にあります」

書籍「ソフトを他人に作らせる日本、自分で作る米国」を読んでいたところ、元日本IBMの方によるタイトルの発言が飛び出した。この業界に長くいると、仮想記憶に仮想計算機と「仮想」という訳語にはまったく違和感を感じなくなってしまったが。。。曰く、IBMがVirtual memoryを発表したとき(MVSのことかな*1)、日本IBMが仮想記憶と訳したのだそうな。『virtualは「事実上の」「実質的」という意味であり、virtual memoryは「本来のメモリーではないが事実上メモリーとして使える技術」を意味する。』

大学時代の恩師も次のように言っていた。

「仮想」という概念が、コンピュータの世界に入ったのは、19751965年のことである。MITがMULTICSという汎用大型TSSの構想を発表した。これが現在の、パソコンネットワーク時代の幕開けの狼煙であった。この中の技術に「仮想記憶」の概念が含まれていた。仮想(virtual)とは「虚」であって、「実質的には「実」の働きをするもの」というコンセプトである。現在、'virtual' に「仮想」という日本語訳が定着したが、この概念自身は、日本語には存在しなかった。

恩師は落語好きで、「仮想」というコンセプトを表現した落語として「だくだく」という演題を紹介されている。

仮想という訳語の出本がわかり、ちょっとすっきりしたので、記事を書いてみた。

(追記)やねうらお氏も書いてたよと言うコメントがあったので、あわせて紹介。「virtualを「仮想」と訳していいものか
あと、翻訳に絡む話だと、「「エラー忘却型コンピューティング」なんて言い出したのは誰だ!」なんて記事もあわせてどうぞ。

ソフトを他人に作らせる日本、自分で作る米国

ソフトを他人に作らせる日本、自分で作る米国

*1:久野先生によると、SVSが先で、MVSはその次とのことです。詳しくはWikipediaなどで。

brewでGo言語をインストール

A Tour of Goを進んでいくと、HTTPサーバの例が。お、Playgroundで通信ができるのか?と思ったら、案の定、ローカルで実行せよとのこと。

というわけで、brewでインストール。

$ brew update
$ brew install go
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/go-1.3.1.mavericks.bottle.1.tar
######################################################################## 100.0%
==> Pouring go-1.3.1.mavericks.bottle.1.tar.gz
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  http://golang.org/doc/code.html#GOPATH

`go vet` and `go doc` are now part of the go.tools sub repo:
  http://golang.org/doc/go1.2#go_tools_godoc

To get `go vet` and `go doc` run:
  go get code.google.com/p/go.tools/cmd/godoc
  go get code.google.com/p/go.tools/cmd/vet

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
  /usr/local/Cellar/go/1.3.1: 4341 files, 114M

コメントに従って、.bash_profileに環境変数の設定を追加。

export GOPATH=$HOME/go
export GOROOT=/usr/local/opt/go/libexec
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin

bashの補完も効くようなので、続けてbash-completionをインストール。

$ brew install bash-completion
==> Downloading http://bash-completion.alioth.debian.org/files/bash-completion-1.3.tar.bz2
######################################################################## 100.0%
==> Patching
patching file bash_completion
==> ./configure --prefix=/usr/local/Cellar/bash-completion/1.3
==> make install
==> Caveats
Add the following lines to your ~/.bash_profile:
  if [ -f $(brew --prefix)/etc/bash_completion ]; then
    . $(brew --prefix)/etc/bash_completion
  fi

Homebrew's own bash completion script has been installed to
  /usr/local/etc/bash_completion.d

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
  /usr/local/Cellar/bash-completion/1.3: 188 files, 1.1M, built in 6 seconds

こちらもコメントに従って.bash_profileに次の記述を追加。ちゃんと補完が効くようになった。

if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi

デフォルトでパッケージ管理システムが組み込まれている訳ね。ドキュメントをインストールしておく。Mercurialを使うので、これも前もってbrew install hgで入れておく。環境変数GOROOT以下にgodocというコマンドがインストールされた。

$ go get code.google.com/p/go.tools/cmd/godoc

はい、ちゃんとHTTPサーバの例題が動きましたとさ。

$ go build 57.go
$ ./57

また、"code.google.com/p/go-tour/wc"のようなパッケージをimportしている例題もあるけど、これをローカルで動かすときは、これもgo getしてくればよい。

$ go get code.google.com/p/go-tour/wc

$GOPATH/src以下にソースコードが、$GOPATH/pkg以下に*.a形式のバイナリパッケージが配置される。

ということで今日は#58まで。

ちなみにCentOS 7のパッケージではGo 1.2になるようだ。

A Tour of Go

Vagrantの作者であるMitchell Hashimotoが、SerfやPacker、TerraformというツールをGo言語で実装していると知り、Go言語を復習しようかなと言う気分に。もう5年も経つのかぁ。

そこで見つけたのが、A Tour of Go。日本語化もされている。Goのプログラムがサーバサイドでコンパイル・箱庭環境で実行されて、結果が表示される。無限ループするようなプログラムはちゃんと強制停止させられるし、一部利用できるパッケージ等に制限がある。これはいい教材だな。

runtime.GOOSの戻り値からもわかるが、これはNaCl (Native Client)で動いているんだ。ほぉ。「Inside the Go Playground」(The Go Blog)

とりあえず今日は#36のsliceあたりまでやってみた。ちょうど半分くらいかな。

あ、Go言語にもruneって生き残っているんだ(「UTF-8とルーン文字」)。

CentOS 7設定メモ

サーバにCentOS 7をインストールしたので、メモを残しておく。

ネットワーク

あぁ、インタフェース名がenp6s0とかenp7s0になっているね。それぞれのPCI IDは06:00.0と07:00.0。

管理ツールはNetwork Administration Toolがなくなり、Network Managerに一本化されたそうな。今まではインストール後速攻に削除していたけど、使ってみるか。Network Managerではネットワーク設定をコネクションという概念で抽象化しているけど、一番単純なケースはインタフェース=コネクション。

設定ファイル自体は/etc/sysconfig/network-scripts/ifcfg-<コネクション名>なのは一緒。ターミナルから使えるコマンドは、nmtuiとnmcli。

$ nmcli c sh  # コネクション一覧表示
$ nmcli d sh enp6s0  # デバイスenp6s0の情報表示

SSH

sshd_configを編集して、サービスを有効にしておく。

$ sudo systemctl start sshd.service
$ sudo systemctl enable sshd.service

ファイアウォール

iptablesサービスの代わりにfirewalldが導入されている。内部的にはiptablesコマンドでnetfilterの設定を行っている。

ゾーンってのがあるね。デフォルトはpublic。/usr/lib/firewalld/zones以下にゾーン毎の設定が記述されたXMLファイルがある。これによるとsshとdhcpv6-clientだけ許可するようだ。

$ sudo firewall-cmd --get-default-zone
public
$ sudo firewall-cmd --get-active-zone
public
  interfaces: enp6s0

例えば、80番ポートを通すために、ゾーンにサービスを追加する場合は、こんな感じ(--permanentオプションを付けると再起動後も有効になる)。

$ sudo firewall-cmd --add-service=http --zone=public --permanent

クラスタを作るには、外部用をexternal、内部用をinternalにするとよいかな。externalにはデフォルトでmasqueradeの設定が入っている。

Rich rulesという感じで、iptablesの記法で指定することもできるとのこと。

NFS

/homeをクラスタ内で共有する。まずはNFSサーバ側の設定。

$ cat /etc/exports
/home 192.168.0.0/24(rw)

systemdの設定。nfs-server.serviceとnfs-lock.serviceを起動する。

$ sudo systemctl enable nfs-server.service nfs-lock.service
$ sudo systemctl start nfs-server.service nfs-lock.service

デフォルトではNFS関係のパケットはファイアウォールを通過できないので、ルールを変更する。

$ sudo firewall-cmd --add-service=nfs --permanent 
$ sudo firewall-cmd --add-service=mountd --permanent          
$ sudo firewall-cmd --add-service=rpc-bind --permanent        
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (default, active)
  interfaces: enp5s0 enp6s0 virbr0
  sources: 
  services: dhcpv6-client mdns mountd nfs rpc-bind ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

あとはクライアント側の/etc/fstabを修正する。

172.168.0.1:/home       /home   nfs     rw,hard,intr,rsize=32768,wsize=32768,async      0 0

このままではmountできない。SELinuxの設定が必要なようだ。ということで、/etc/selinux/configを編集して無効化。。。

QEMU/KVM

CentOS 7で採用されているバージョンは、QEMU/KVMが1.5.3、libvirtが1.1.1。

vagrantとか使っていると、面倒くさいなと感じてしまうが、ISOイメージをダウンロードして、virt-installでゲストOSをインストールする。CLIで済ます。

$ sudo yum install qemu-kvm libvirt virt-install
$ sudo systemctl enable libvirtd.service
$ sudo systemctl start libvirtd.service
$ qemu-img create -f qcow2 /data/images/guest1-centos7.img 8G
$ sudo virt-install --name=guest1-centos7 --hvm --virt-type=kvm \
--disk path=/data/images/guest1-centos7.img,format=qcow2 --graphics none \
--vcpus=2 --ram=2048 --location=/data/iso/CentOS-7.0-1406-x86_64-Minimal.iso \
--network bridge=virbr0 --os-type=linux --os-variant=rhel7 \
--extra-args='console=tty0 console=ttyS0,115200n8'

久々にやったらパラメータ間違えて途中で止まって中途半端な状態に。その場合は、

$ sudo virsh undefine guest1-centos7

で消去してやり直す。

以下はオプショナルな設定。

Nested VMXを実行する場合は、次のファイルを用意して、kvm_intelモジュールをリロードする。

$ cat /etc/modprovbe.d/kvm-nested.conf
options kvm_intel nested=1

libvirtの方は、最低限VMXのfeature bitだけを立てればいいが、CPUモードをhost-passthroughにしてもOK。ただ、host-passthroughは安定している雰囲気ではないので、お勧めしない。

  <cpu mode='host-passthrough'/>

Vagrant Google Compute Engineプロバイダ

Vagrant本によるとAWSプロバイダがあるそうで、GCE版もあるかとググったところ、案の定、Vagrant GCE Providerが見つかった。プロバイダとはハイパーバイザやクラウドのように、仮想環境を実行するプラットフォームのことで、VirtualBox以外にVMWareHyper-V、Docker、AWSなどに対応している。

GCEプロバイダはプラグインとして提供されているので、ホームページにしたがってインストールを進める。

$ vagrant plugin install vagrant-google
Installing the 'vagrant-google' plugin. This can take a few minutes...
Installed the plugin 'vagrant-google (0.1.3)'!

前準備として、GCEのDeveloper consoleの"API & Auth" -> CredentialsからClient IDを生成する。アプリケーションタイプはService account。生成が終わると、秘密鍵(*.p12)が自動的にダウンロードされ、パスワードがポップアップされる。これでプラグインの利用に必要なE-mailアドレスがページに表示されているはず。

続いてダミーのboxを追加する。

$ vagrant box add gce https://github.com/mitchellh/vagrant-google/raw/master/google.box
==> box: Adding box 'gce' (v0) for provider: 
    box: Downloading: https://github.com/mitchellh/vagrant-google/raw/master/google.box
==> box: Successfully added box 'gce' (v0) for 'google'!

次にVagrantfileを編集する。試しに作ったのはこんな感じ。GCEだとユーザ名はVagrantではなく、ローカルユーザ名と同じになるので、それに合わせてoverrideする。Project IDなどは直接書くのは(gitなどで管理するには)セキュアじゃないので、環境変数で与えるようにしておく。

Vagrant.configure("2") do |config|
  config.vm.box = "gce"

  config.vm.provider :google do |google, override|
    google.google_project_id = ENV['GCE_PROJECT_ID']
    google.google_client_email = ENV['GCE_CLIENT_EMAIL']
    google.google_key_location = ENV['GCE_KEY_LOCATION']

    google.image = "centos-7-v20140903"
    google.machine_type = "f1-micro"
    google.zone = "asia-east1-c"

    override.ssh.username = "oraccha"
    override.ssh.private_key_path = "~/.ssh/google_compute_engine"
  end
end

vagrant upする。なんだか共有フォルダ(正確にはrsyncを使ったsynched folderだっけ)の作成でエラーが出ているけど、とりあえず無視する*1

$ vagrant up --provider=google
  :
Vagrant::Errors::VagrantError: The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

mkdir -p '/vagrant'

Stdout from the command:



Stderr from the command:

sudo: sorry, you must have a tty to run sudo

はい、ちゃんとSSHできた。

$ vagrant ssh
[oraccha@i-2014091622 ~]$ sudo virt-what 
kvm

vagrant destroyでVMインスタンスは破棄される。あと、vagrant suspendやhaltには対応していないみたいね。

実践 Vagrant

実践 Vagrant

*1:CentOS 7のsudoersファイルでは、requirettyがデフォルトで有効になっているのが問題の原因なんだろうけど、どうしたらよいのかな?

Google Compute Engine事始め

佐藤さんの講演を聴いて、プロモーションコードをゲットしたことだし*1、GCEを少し試してみることにした。中身を見ずに「Google Compute Engine入門」という書籍も買ってみたのだけど、すでに内容が古くなっている気が。。。本書ではgutilというCLIツールを使っているのだけど、すでにgutilからgcloudというツールに乗り換えることが推奨されている。

この辺を見ながらgcloudを含むSDKをインストール。

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

GCEを使うためのOAuthの設定のためにgcloud auth loginを実行する。実行すると勝手にブラウザが認証用ページに飛び、よしなにしてくれる。

$ gcloud auth login

Developers consoleでプロジェクトを作り、早速インスタンスを立ち上げてみる。asia-east1-cってゾーンがあるね。東アジアリージョンは比較的新しいので、IvyBridgeのサーバを使っているようだ。自宅からだとpingで50ms(どこかで台湾と読んだが、本当か?)。OSはCentOS 7を選択。コマンドラインから実行する場合は、次のようになる。

$ gcloud compute instances create instance-1 --machine-type f1-micro --image centos-7 --zone asia-east1-c --project  shaped-producer-XXX
NAME       ZONE         MACHINE_TYPE INTERNAL_IP   EXTERNAL_IP     STATUS
instance-1 asia-east1-c f1-micro     10.240.192.83 XXX.XXX.XXX.XXX RUNNING

なお、選択可能なインスタンスタイプ(machine-types)は次のコマンドで調べることができる。OSイメージはEC2ほど選択肢はない。

$ gcloud compute machine-types list --zone asia-east1-c --project shaped-producer-XXX
NAME           ZONE         CPUS MEMORY_GB DEPRECATED
f1-micro       asia-east1-c 1     0.60
g1-small       asia-east1-c 1     1.70
n1-highcpu-16  asia-east1-c 16   14.40
n1-highcpu-2   asia-east1-c 2     1.80
n1-highcpu-4   asia-east1-c 4     3.60
n1-highcpu-8   asia-east1-c 8     7.20
n1-highmem-16  asia-east1-c 16   104.00
n1-highmem-2   asia-east1-c 2    13.00
n1-highmem-4   asia-east1-c 4    26.00
n1-highmem-8   asia-east1-c 8    52.00
n1-standard-1  asia-east1-c 1     3.75
n1-standard-16 asia-east1-c 16   60.00
n1-standard-2  asia-east1-c 2     7.50
n1-standard-4  asia-east1-c 4    15.00
n1-standard-8  asia-east1-c 8    30.00

(Webコンソールから)インスタンスが起動すると、ダッシュボードにインスタンスが表示されるので、SSHというボタンを押す。すると、「gcloud compute --project "shaped-producer-XXX" ssh --zone "asia-east1-c" "instance-1"」のような文字列がポップアップされるので、これをターミナルにコピペする。SSH公開鍵を登録してない場合は、新たに生成されるようだ。このようなSSHのラッパーのほか、ファイルを転送するためのpush/pullコマンドなども用意されている。

$ gcloud compute --project "shaped-producer-XXX" ssh --zone "asia-east1-c" "instance-1"
WARNING: You do not have an SSH key for Google Compute Engine.
WARNING: [/usr/bin/ssh-keygen] will be executed to generate a key.
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/oraccha/.ssh/google_compute_engine.
Your public key has been saved in /Users/oraccha/.ssh/google_compute_engine.pub.
The key fingerprint is:
3d:8c:58:eb:c7:6d:9a:ae:af:59:e6:db:81:d6:64:e6 oraccha@MBA11.local
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|        .        |
|       o =       |
|      . S + +    |
|       . . X     |
|        . B E    |
|         B = .   |
|        +=B..    |
+-----------------+
Updated [https://www.googleapis.com/compute/v1/projects/shaped-producer-XXX].
Warning: Permanently added 'XXX.XXX.XXX.XXX' (RSA) to the list of known hosts.
Saving password to keychain failed
Identity added: /Users/oraccha/.ssh/google_compute_engine (/Users/oraccha/.ssh/google_compute_engine)
Warning: Permanently added 'XXX.XXX.XXX.XXX' (RSA) to the list of known hosts.
[oraccha@instance-1 ~]$ uname -a
Linux instance-1 3.10.0-123.6.3.el7.x86_64 #1 SMP Wed Aug 6 21:12:36 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

ちゃんとKVMで動いているようね。

$ systemd-detect-virt 
kvm

ちょっとネットワーク周りを見てみると、eth0にはプライベートアドレスが割り当てられているから、NATでルーティングされているようね。MTUが1460バイト。40バイトはどこへ行ったのでしょう。やはり、GoogleのSDN「Andromeda」がらみかなぁ。あと、デバドラはvirtio_net。

$ ip a show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP qlen 1000
    link/ether 42:01:0a:f0:c0:53 brd ff:ff:ff:ff:ff:ff
    inet 10.240.192.83/32 brd 10.240.192.83 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4001:aff:fef0:c053/64 scope link 
       valid_lft forever preferred_lft forever

$ ip r
default via 10.240.0.1 dev eth0  proto static  metric 1024 
10.240.0.1 dev eth0  proto static  scope link  metric 1 

インスタンスの生成・削除ももちろんgcloudコマンドから操作可能。あと、gcloud config set project XXXを実行しておけば、いちいち--projectオプションを指定する必要はない。

$ gcloud compute instances delete instance-1 --zone asia-east1-c
The following instances will be deleted. Attached disks configured to 
be auto-deleted will be deleted unless they are attached to any other 
instances. Deleting a disk is irreversible and any data on the disk 
will be lost.
 - [instance-1] in [asia-east1-c]

Do you want to continue (Y/n)?  

Deleted [https://www.googleapis.com/compute/v1/projects/shaped-producer-XXX/zones/asia-east1-c/instances/instance-1].

確かにEC2と比較すると、CLI周りはよくできているな。

Google Compute Engine入門

Google Compute Engine入門

*1:https://cloud.google.com/developers/starterpack/からプロモーションコードを入力することで500 USD分無料で使えるようになる。