AWS ソリューションアーキテクト アソシエイトを取得したので勉強方法など
今やIT業界で知らない者はいないレベルのAmazon Web Services(AWS)ですが、ソリューションアーキテクトアソシエイト(以下、SAA)認定を取得してみましたので、(100番煎じくらいですが)勉強方法などを共有します。
基本方針は
- できるだけお金を使いたくない
- ダラダラ勉強せずサッサと取りたい
の2点です。AWS Summit Tokyo2017までに間に合わせて合格者バッジが欲しいという事もあり、かなり短めの期間で臨みました。
自分のAWSと知識
試験要件
公式ホームページより。AWS 認定ソリューションアーキテクト – アソシエイト | AWS
- 試験時間: 80 分間
- 本試験受験料: 16,200円(日本語版/税込)
- AWS における分散システムの可用性、コスト効率、高耐障害性およびスケーラビリティの設計に関する 1 年以上の実際の経験
- 最低でも 1 つのハイレベルプログラム言語についての深い知識
- AWS ベースのアプリケーションに関する要件の識別と定義についての能力
- オンプレミスと AWS の構成要素を組み合わせた複合システムのデプロイの経験
- AWS プラットフォームで安全性と信頼性の高いアプリケーションを構築するためのベストプラクティスを提供する能力
やはり情報処理技術者試験などと比べると高めですね。私は会社から取れと言われた訳でもないのも、自腹で受験しました。みみっちい話ですが、2万円弱を無駄にする訳にはいかない!というのは割りと大きな勉強のモチベーションとなりました。
試験対策
①「Architecting on AWS」の受講
手始めに会社の後輩からオススメされた以下の研修を受講しました。
aws.amazon.com
価格は$2100!それなりにしますね・・。ここは会社の研修制度で受講させてもらいました。
オススメかオススメでないかと言われると会社で受けさせてくれるならばオススメです。
受講の効果としては、
- SAA試験でかなり問われる「ベストプラクティス」を体系的に解説してくれる
- 今までちゃんと触ったことのないサービスも「どのように使うか」を体系的に習得できる
- 講師の方が試験で出るポイントを教えてくれる
など、やはりオフィシャルの研修だけあって、充実した内容です。。私の参加した会は30代〜40代の方が中心のようでした。
なお、この研修の難点を上げるとすると
- Qwiklabsを使ったハンズオン演習があるが、受講期間中のみしか利用できない。
- グループディスカッションと発表があるため、その類が嫌いな方には辛い。
- 品川会場で受講した場合、食事処が周囲に無い。
と言ったところでしょうか。特にQwiklabsの演習は研修後にも復習したいと思っていたため、少々残念でした。それなりのお金を払ってはいるので、受講後も演習ができるように是非していただきたいですね・・。受講期間中であれば、自宅からでも演習をやり直す事ができますので、期間中にマスターすることをおすすめします。
難点も挙げましたが、講師の方は自分の業務での利用を踏まえた質問等にも応じてくださるので、内容自体は価格に見合ったものを提供してくれる研修という印象です。
②本を読みながら手を動かす勉強
「Architecting on AWS」では各プロダクトの細かいところまでハンズオンで学習することはありません。受講後、デプロイの仕方の概念等は理解していても実際の利用経験が不足しているサービスが割りとありましたので、以下の本を読みながら、AWSサービスを実際に使ってみる経験を積みました。
AWSのサービスは良く手が加えられますので情報が古いところもありますが、AWSコンソール(GUI)とコマンドラインツール(CLI)双方で使い方が載っていますので、非常に分かりやすくオススメです。
基本的には、自分のAWSアカウントで使ったことの無いサービスを中心に触っていったのですが、やはり個人のアカウントでお金をかけたくないので、Qwiklabsも活用しました。
qwiklabs.com
全部が無料では無いのですが、無料でAWSサービスを触れるセッションも用意されています。Qwiklabsはその物が学習用のセッションを提供しているのですが、重要なのは無料で学習対象のサービスを触れる環境を与えてくれるというところです。つまり、QwiklabsでAWSコンソールを立ち上げつつ、実際は本に従って学習していく、と言う形で極力自分のアカウントを使わない(=お金を使わない)ようにしていきました。
③模擬試験の受験とサンプル問題の確認
試験の公式ページに案内がありますが、2160円で模擬試験を受験することが可能です。
また、各試験のサンプル問題がPDF形式で無料配布されていますので、両方とも実施いたしました。
aws.amazon.com
今回の学習の中でこれが最も効果がありました。自分の到達度を知ることができるというのも大きいですが、公式に問題だけあって本番にかなり近いレベルだったと記憶しています。(問題をコピーすることは出来ないため、記憶頼りですが・・。)
サンプル問題は全て答えがついていますので、答えを隠しながら自分で解いてみるのが良いでしょう。また、SAA試験だけでなくデベロッパーとSysOpsのサンプル問題もやっておくと良いです。3試験のサンプル問題をすべてやったとしても1時間以内には終わるでしょう。(もちろん、間違えた問題は何が間違いかを考える事が効果的な学習につながる部分です。)
模擬試験は受験直前に実力試しに受けるというよりは、ある程度学習が進んだあたりで一度受けてしまうことをおススメします。個人的な意見ですが、実力を測るという事も大事ですが、実際に問題を解く、間違えたと思われる答えの正解を考え直すなどの作業が模擬試験の効果が発揮されたところだったと思います。模擬試験は自分のPCで受けられますが、最終的な正解は表示されません。問題と選択肢を覚えておいて、後で何の問題を間違えたか考え直す作業が本番につながります。私は「Architecting on AWS」の講習を受けた数日後に受験しましたが、正解率45%で不合格でした。正直、もっと簡単かと思っておりましたが、現実を目の当たりにしたのでより集中して学習するモチベーションにつながりました。
④まとめ
最終的にかかったお金と期間をまとめてみます。
項目 | 費用 |
---|---|
Architecting on AWSの受講 | 0円(会社費用のため。実際は$2100。) |
Amazon Web Services実践入門 | 0円(会社に転がっていたため。実際は2,786円。) |
Qwiklabs | 0円(無料部分のみ) |
AWS使用料 | 500円 |
模擬試験 | 2160円 |
受験料 | 16,200円 |
学習方法 | 機関 |
---|---|
①「Architecting on AWS」の受講 | 3日間 |
②本を読みながら手を動かす勉強 | 6日間 |
③模擬試験の受験とサンプル問題の確認 | (②と並行) |
という事で自腹で払った費用は18,860円、学習期間は2週間弱、といったところです。やはり受験費用がそれなりにしますので個人で受けるとそこそこの支出ですね。
なお、結果は正解率66%で合格でした。他の受験体験記などを拝見したところ、65%程度が合格ラインとの記載が多くみられましたので、かなりギリギリだったと思われます。AWS Summitに間に合わせるため、かなり短い期間で受験に臨みましたが、実際はもう少し勉強しておくべきだったと反省しております。
ギリギリで合格したからというわけではありませんが、試験内容は思ったより難しかった印象です。「アソシエイト」レベルのため、正直「AWSは長年使っているし、使ったことのないサービスも概要は知っているし、大丈夫だろう」と思っていましたが、かなり広範にわたって知識を問われたという感じでした。恐らく、模試で「不合格」の現実を突きつけられなければ、本番も不合格だったかと思います。他の合格者の方ともお話したのですが、割と同じような意見を仰っておりましたので、AWS利用経験のある方もしっかりと準備をして臨まれるとよろしいかと思います。
仮説推論エンジン"Phillip"を動かしてみた
昨今流行りのAIの影響か、推論エンジンを動かす機会があったので、構築メモ。
(※私はネットワークレイヤの人間なので推論エンジンって何?って聞かれても、あまり詳しくはわかりません。会社から依頼されたのですが、明らかに人選ミスな気がする。)
いくつかそれっぽいものがgithubに公開されているが、今回使ってみたのは「Phillip」という物。
github.com
githubのReadmeを見る限りでは、日本の方が作られた模様。WindowsやOS Xでも動くそうなのだが、Linux環境で動かすことを求められたのでLinux。
環境はみんな大好きAWSでAmazon Linuxのインスタンスを立てて試してみた。
1.ダウンロード
githubに書かれているインストール方法に従ってとにかくやってみる。
Getting Started · kazeto/phillip Wiki · GitHub
まずはサクッとgit clone。
$ git clone https://github.com/kazeto/phillip.git
次の手順は、
Move to the directory where Phillip is installed.
と書かれているが、とりあえずホームディレクトリで動けばいいのでこのままで。
2.Makefile生成
これも公式に従って実施するだけ。pythonは2.7指定だったのでyumでインストール済み。
聞かれるのは
- バイナリの配置場所
- LP-SOLVEを使うかどうか
- GUROBIを使うかどうか
の3つだけ。バイナリ配置場所はデフォルトで良しとし、ライブラリは二者択一で良いようなので、LP-SOLVEを使うこととする。
(GUROBIはダウンロードにアカウント作成などが必要で面倒くさかった。。。)
$ cd ./phillip $ python tools/configure.py *** Configuration of Phillip *** --> BINARY TARGET [default=bin/phil]: --> USE-LP-SOLVE [y/n]: y --> USE-GUROBI [y/n]: n
3.ライブラリのインストール&コンパイル
あとはライブラリをダウンロードしてコンパイルするだけらしい。LP-SOLVEの5.5系なら良いらしいので↓からダウンロード。
https://sourceforge.net/projects/lpsolve/files/lpsolve/5.5.2.5/
何がなんだかわからんが、とりあえず”lp_solve_5.5.2.5_exe_ux64.tar.gz”がそれっぽいので落として展開。公式にパスを通せと書いてあるのでパスを通す。そんでmake.(exportコマンドを打っているように見えますが、実際は.bash_profileに記載してます。)
$ mkdir lp_solve $ mv lp_solve_5.5.2.5_exe_ux64.tar.gz ./lp_solve $ tar xzvf ./lp_solve/lp_solve_5.5.2.5_exe_ux64.tar.gz $ export CPLUS_INCLUDE_PATH=$HOME/phillip/lp_solve $ make 〜省略〜 rc/././sol/ilp_solver.h:14:20: fatal error: lp_lib.h: No such file or directory #include <lp_lib.h> ^
はい。lp_lib.hが足りないらしい。多分ソースファイルにおいてありそうなので、ダウンロードのサイトに戻って今度は"lp_solve_5.5.2.5_source.tar.gz"をダウンロードして展開。パスも通す。
$ mkdir lp_solve_src $ mv lp_solve_5.5.2.5_source.tar.gz ./lp_solve_src $ tar xzvf ./lp_solve_src/lp_solve_5.5.2.5_source.tar.gz $ export CPLUS_INCLUDE_PATH=$HOME/phillip/lp_solve_src/lp_solve_5.5 $ make 〜省略〜 /usr/bin/ld: cannot find -llpsolve55 collect2: error: ld returned 1 exit status make: *** [all] Error 1
なるほどなるほど〜。こんどはlpsolve55というライブラリが足りないらしい。ライブラリだからdevかなという適当な推測の元、今度は"lp_solve_5.5.2.5_dev_ux64.tar.gz"をダウンロードして展開。ライブラリとしてパスを通す。
$ mkdir lp_solve_dev $ mv lp_solve_5.5.2.5_dev_ux64.tar.gz ./lp_solve_src $ tar ./lp_solve_dev/lp_solve_5.5.2.5_dev_ux64.tar.gz $ export LIBRARY_PATH=$LIBRARY_PATH:$HOME/phillip/lp_solve_dev $ make
無事に終わったらしい。
4.知識ベースのコンパイル
公式に従って、LISP形式のインプットを準備する。知識ベースが何かはわかってないよ。詳しい同僚はオントロジーがどうトリプルがどうとか親切に教えてくれた。(けど、基礎知識がなさすぎてあんまりよくわからんかった。あとで調べてみよう。)
- kb.lisb
(B (name kb01) (=> (steal-vb e1 x y) (criminal-jj e2 x))) (B (name kb02) (=> (criminal-jj e1 x) (arrest-vb e2 y x)))
- obs.lisp
; "Tom robbed jewels. Police arrested him." (O (name obs01) (^ (steal-vb E1 Tom Jewel) (arrest-vb E2 Police he)))
そして、この入力をつかって知識ベースをコンパイル。
$ bin/phil -m compile -c dist=basic -c tab=null -k compiled -P 8 kb.lisp # 04/05/2017 11:02:41] Phillip starts... # 04/05/2017 11:02:41] version: phil.3.19 〜省略
とりあえずできたっぽいね。
4.実行
これでいよいよ実行環境が整ったっぽい。
$ bin/phil -m infer -k compiled -c lhs=depth -c ilp=weighted -c sol=gurobi -P 8 -T 120 obs.lisp 〜省略 <phillip> <configure> <version>phil.3.19</version> <time_stamp compiled="Apr 5 2017 10:57:03" executed="Apr 5 2017 11:15:15"></time_stamp> <components lhs="DepthBasedEnumerator" ilp="weighted-converter" sol="gurobi-optimizer"></components> <knowledge_base path="compiled" size="2" max_distance="-1"></knowledge_base> <params timeout_lhs="-1" timeout_ilp="-1" timeout_sol="-1" timeout_all="120" verbose="1" gurobi_thread_num="8" kb_thread_num="8"></params> </configure> </phillip>
出力結果が何なのかは後でゆっくり見るとしてとりあえず動作しました。
大層なことをやったような書き方になってしまいましたが、公式のチュートリアルそのまんま走らせただけですね。。。
5.追記
どうも出力に結果が含まれていないと思ったら、オプションで指定しているプログラム指定がLP-SOLVEになっていなかった。
$ bin/phil -m infer -k compiled -c lhs=depth -c ilp=weighted -c sol=lpsolve -P 8 -T 120 obs.lisp <phillip> <configure> <version>phil.3.19</version> <time_stamp compiled="Apr 5 2017 10:57:03" executed="Apr 6 2017 03:39:53"></time_stamp> <components lhs="DepthBasedEnumerator" ilp="weighted-converter" sol="LP-Solve"></components> <knowledge_base path="compiled" size="2" max_distance="-1"></knowledge_base> <params timeout_lhs="-1" timeout_ilp="-1" timeout_sol="-1" timeout_all="120" verbose="1" gurobi_thread_num="8" kb_thread_num="8"></params> </configure> <proofgraph name="obs.lisp::obs01" state="optimal" objective="10"> <time lhs="0" ilp="0" sol="0.001" all="0.001"></time> <timeout lhs="no" ilp="no" sol="no" all="no"></timeout> <literals num="4"> <literal id="0" type="observable" depth="0" active="yes" paid-cost="yes" cost="10.000000">(steal-vb E1 Tom Jewel):0</literal> <literal id="1" type="observable" depth="0" active="yes" paid-cost="no" cost="10.000000">(arrest-vb E2 Police he):1</literal> <literal id="2" type="hypothesis" depth="1" active="yes" paid-cost="no" cost="12.000000">(criminal-jj _u1 he):2</literal> <literal id="3" type="hypothesis" depth="2" active="yes" paid-cost="no" cost="14.400000">(steal-vb _u2 he _u3):3</literal> </literals> <explanations num="2"> <explanation id="0" tail="0:{1}" head="1:{2}" active="yes" backward="yes" axiom="kb02" gap="">(arrest-vb E2 Police he):1 => BACKWARD(axiom=1) => (criminal-jj _u1 he):2</explanation> <explanation id="1" tail="1:{2}" head="2:{3}" active="yes" backward="yes" axiom="kb01" gap="">(criminal-jj _u1 he):2 => BACKWARD(axiom=0) => (steal-vb _u2 he _u3):3</explanation> </explanations> <unifications num="1"> <unification l1="0" l2="3" unifier="E1=_u2, Tom=he, Jewel=_u3" active="yes" gap="">(steal-vb E1 Tom Jewel):0 ^ (steal-vb _u2 he _u3):3 => UNIFY => (= E1 _u2):4 ^ (= Tom he):5 ^ (= Jewel _u3):6</unification> </unifications> </proofgraph> </phillip>
BitbucketのSSH接続エラー
みんな大好きBitbucketは自分も愛用しているのですが、
今までpushする際にはSSHではなくHTTPS経由でpushしていました。
SSH経由に変えようとしたところ、アホみたいなミスでpushエラーが起きまくったので記載。
発生したエラー
要するに「あなたの登録した鍵ではアクセスできませんよ!」というエラー。
$ git push -u origin --all ermission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
状況(やったこと兼手順)
Macで以下の手順を実施。途中の鍵コピー以外はCentOSなどでも同じはず。
SSHキーを作成。
$ ssh-keygen -f ~/.ssh/bitbucket -t rsa -C hoge@hoge.com
Bitbucketに鍵を登録。
鍵をコピーする。(Mac以外の方は手動でコピーすれば良いです。)
$ cat ~/.ssh/bitbucket.pub | pbcopy
で、Bitbucketのアカウントの管理>SSHキーから公開鍵を登録。
SSHのconfigを設定
エディタでSSHのコンフィグにBitbucket宛の設定を記載する。
(注:ここが間違っています。正解を見たい方は一番下をご覧ください。)
Host bitbucket HostName bitbucket.org IdentityFile ~/.ssh/bitbucket User git
BitbucketにSSHでアクセス。
まずはSSHコマンドでアクセス。普通に成功する。
$ ssh -T git@bitbucket logged in as hogehoge. You can use git or hg to connect to Bitbucket. Shell access is disabled.
リポジトリのディレクトリに異動し、push先を設定。
$ cd <リポジトリのディレクトリ> $ git remote add origin git@bitbucket.org:<ユーザ名>/<リポジトリ名>.git
Bitbucketにgitリポジトリをpush。ここで失敗する。
$ git push -u origin --all ermission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
原因
SSHのconfig設定におけるHostがgitコマンドにあっていなかった。
誤った設定
Host bitbucket HostName bitbucket.org IdentityFile ~/.ssh/bitbucket User git
configureのコンパイラエラー対処
おなじみconfigure => make => make installの流れでつまづいた場合の解決策。
エラーが出次第、徐々に追記していきたい。
zlib.hが参照できないと言われる
エラー表示
configure: error: zlib.h is required
対処方法
zlib,zlib-develをインストールする
$ sudo yum install zlib zlib-devel
bzlib.hが参照できないと言われる
エラー表示
configure: error: bzlib.h is required
対処方法
bzip2,bzip2-develをインストールする
$ sudo yum install bzip2 bzip2-devel
Windows7にVagrant環境を作ってRuby on Railsを動かしてみる①
Ruby on Railsを学んでみようと思い、無料で公開されているチュートリアルをやってみています。
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう
今まではAWS上に建てたサーバでコーディングしていましたが、ブラウザで作ったサイトを見るのにローカルの方が楽なので、PC上にVagrantをインストールして、CentOSを動かしたうえでRailsをやってみようと思います。
Vagrant環境の準備
Vagrantを使うためには
のインストールが必要になります。
どれからインストールしてもそれほど問題はありませんでした。
Rubyのインストール
私のローカルPCにはRubyすら入っていなかったので、まずはRubyを入れます。
下記のサイトにWindowsインストーラ形式のバイナリがおいてあるのでダウンロードしてきます。私は最新版の2.2.1-p85(64ビット版)を落としてインストールしてきました。
RubyInstaller for Windows
インストーラが環境変数まで設定してくれる・・。便利!コマンドプロンプトで確認してみます。(Linuxのコマンドのように書いてありますが、"C:\"などと書くのが面倒なだけで、Windowsのコマンドプロンプトを使っています。ここら辺のコマンドはどっちでも一緒だし。)
$ ruby -v ruby 2.2.1p85 (2015-02-26 revision 49769) [x64-mingw32]
無事にインストール完了。
VirtualBoxのインストール
同じく下記のサイトからダウンロードしてインストールするだけ。
Downloads – Oracle VM VirtualBox
適当にインストーラを進めて行けば無事にインストール完了。
ここで再起動を求められるかもしれません。
バーチャルマシンの起動
まずはVagrantにバーチャルマシンを登録する作業からです。下記に使えるイメージファイルがおいてあるため、好きな物を選択。
A list of base boxes for Vagrant - Vagrantbox.es
CentOSが使いたかったので、"CentOS 6.5 x86_64"を選択します。右に書いてあるURLをコピーして、コマンドプロンプトで下記のコマンドを打ちます。
(※ディレクトリは好きな場所に移動してください。)
vagrantはコマンド名、boxはイメージファイル全般を扱うオプション、addはboxのオプションでイメージを追加するオプション、centos_6_5はダウンロードするイメージのタグのようなもの(なんでもOK)、そして最後にダウンロードするイメージのURLです。
$ vagrant box add centos_6_5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
自動的にダウンロードが始まるので、完了するまでしばし待ちましょう。
ダウンロードが完了したら、下記のコマンドで環境の初期化を行います。
$ vagrant init centos_6_5
"Vagrantfile"がカレントディレクトリにできたよ!というメッセージが出てくると思います。
これはVagrantを起動する際に使う設定になりますが、とりあえず動かしてみるには触らなくとも大丈夫ですので、そのまま起動してみます。
$ vagrant up
ディスク容量が圧迫されていたり、Rubyの環境変数がうまく通っていないなどが無い限り、うまくいくと思います。デフォルトでは127.0.0.1の2222ポートがsshでつなげるようになっているはずです。(その旨表示が出ます。)
git pushで「Gtk-WARNING **: cannot open display」とエラーが出た場合
bitbucketにgit pushしようとしたら、エラーで怒られてしまった。
$ git push (gnome-ssh-askpass:XXXXX): Gtk-WARNING **: cannot open display:
cannot open displayというエラーは
「パスワード入力窓をgnomeがオープンできないよ!」
と言われているらしい。
httpsでログインを試みる設定にしていたため、パスワードを求められているようだ。
色々な方が書かれているが、「SSH_ASKPASS」を環境変数から削除すれば良さそう。
$ unset SSH_ASKPASS $ git push Password:
無事、うまくpushできた。
RMagickのインストールエラー
他の方が開発したrailsアプリを引っ張ってきて、
自分のCentOS環境でbundle installした際に下記のエラー発生。
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. checking for Ruby version >= 1.8.5... yes checking for gcc... yes checking for Magick-config... no Can't install RMagick 2.13.2. Can't find Magick-config ・ ・ ・ An error occurred while installing rmagick (2.13.2), and Bundler cannot continue. Make sure that `gem install rmagick -v '2.13.2'` succeeds before bundling.
ImageMagickが入っていないためのようだ。
$ sudo yum install ImageMagick ImageMagick-devel $ bundle install ・ ・ Installing rmagick 2.13.2 Your bundle is complete!
無事、解決。