AWSおさらい
「Amazon Web Services 基礎からのネットワーク&サーバー構築」という本が出ていたので、AWSのおさらいも兼ねて読んでみる。AWSの上で、インフラ技術を学ぶという趣旨。クラウドが当たり前になって、クラウドじゃないレガシーなシステムが目の前から消えていくと(半分現実になりつつある気がするが)、近い将来にはこんなテイストのテキストが普通になるのかなと感じた。本書はAWSの入門に必要最低限のネットワーク周りの解説が載っているけど、教科書的解説+クラウドで演習といった形式でね。
さて、VPCを触るのは初めてだけど、VPCを作って、その中のインスタンスでApacheを動かすところまで確認した。Tokyo regionだと、RTTは9秒強ぐらいだな。
インスタンスを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 基礎からのネットワーク&サーバー構築
- 作者: 玉川憲,片山暁雄,今井雄太
- 出版社/メーカー: 日経BP社
- 発売日: 2014/07/16
- メディア: 単行本
- この商品を含むブログ (4件) を見る
「Virtualを仮想と誤訳した責任は我々にあります」
書籍「ソフトを他人に作らせる日本、自分で作る米国」を読んでいたところ、元日本IBMの方によるタイトルの発言が飛び出した。この業界に長くいると、仮想記憶に仮想計算機と「仮想」という訳語にはまったく違和感を感じなくなってしまったが。。。曰く、IBMがVirtual memoryを発表したとき(MVSのことかな*1)、日本IBMが仮想記憶と訳したのだそうな。『virtualは「事実上の」「実質的」という意味であり、virtual memoryは「本来のメモリーではないが事実上メモリーとして使える技術」を意味する。』
大学時代の恩師も次のように言っていた。
「仮想」という概念が、コンピュータの世界に入ったのは、
19751965年のことである。MITがMULTICSという汎用大型TSSの構想を発表した。これが現在の、パソコンネットワーク時代の幕開けの狼煙であった。この中の技術に「仮想記憶」の概念が含まれていた。仮想(virtual)とは「虚」であって、「実質的には「実」の働きをするもの」というコンセプトである。現在、'virtual' に「仮想」という日本語訳が定着したが、この概念自身は、日本語には存在しなかった。
恩師は落語好きで、「仮想」というコンセプトを表現した落語として「だくだく」という演題を紹介されている。
仮想という訳語の出本がわかり、ちょっとすっきりしたので、記事を書いてみた。
(追記)やねうらお氏も書いてたよと言うコメントがあったので、あわせて紹介。「virtualを「仮想」と訳していいものか」
あと、翻訳に絡む話だと、「「エラー忘却型コンピューティング」なんて言い出したのは誰だ!」なんて記事もあわせてどうぞ。
- 作者: 谷島宣之
- 出版社/メーカー: 日経BP社
- 発売日: 2013/12/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (8件) を見る
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以外にVMWareやHyper-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には対応していないみたいね。
- 作者: Mitchell Hashimoto,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/02/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (10件) を見る
Google Compute Engine事始め
佐藤さんの講演を聴いて、プロモーションコードをゲットしたことだし*1、GCEを少し試してみることにした。中身を見ずに「Google Compute Engine入門」という書籍も買ってみたのだけど、すでに内容が古くなっている気が。。。本書ではgutilというCLIツールを使っているのだけど、すでにgutilからgcloudというツールに乗り換えることが推奨されている。
$ 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周りはよくできているな。
- 作者: 吉積礼敏
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2014/07/30
- メディア: 大型本
- この商品を含むブログ (2件) を見る
*1:https://cloud.google.com/developers/starterpack/からプロモーションコードを入力することで500 USD分無料で使えるようになる。