AWSに入門しました
3月になり仕事がひと段落したので以前から気になっていたAWSに入門しました。
クラウドと呼ばれるものに触れるのは昨年春にOpenShiftのトレーニング(DO180とDO280)を受けて以来です。DO280はOpenShiftについてある程度理解していることを前提に作成されているため、初見では納得のいく理解ができず、Kubernetesを勉強してからリトライしました。そのときはKubernetes完全ガイドを実践しましたが、環境はGCPではなく6つのRaspberry Pi 2を使ってHA構成のKubernetesを作って勉強したため、クラウドは使用しませんでした。各プログラムのバージョンやRAMの制限等から、HA構成を作るのはなかなか難しくて、ちゃんと動作したときはとても嬉しかったのを覚えています。
AWSは右も左も分からない状態だったため、とりあえず公式サイトを覗いてみたところ、それはもう膨大なサービスが存在していて驚嘆しました。若干引いてしまいましたが、まずは一般的に使用されているサービスを知る必要があるので、体系的に学ぶという意味でも入門書を買おうかなと思い、Amazonで「aws 入門書」を検索しました。業界トップは伊達ではなくて、そこには大量の入門書がありました。認定資格の対策本なんかも表示されていて、以前Twitterで取得した人を見かけたことを思い出し、なんとなく公式サイトのサンプル問題を覗いてみました。サービスだけでなく料金やサポートに関しての問もあり、過去問を解きながらそれに関係する内容を調べていくことで一般的な知識の習得が可能なように思いました。上手くいけば認定も取れて一石二鳥です。
認定は基礎から専門知識まで4つのレベルに分かれており、全部で12種類あります。当然最も簡単なクラウドプラクティショナーをもとに勉強を始めることにしましたが、すぐに過去問が公開されていないことを知りました。サードパーティから模試が販売されており、価格も1500円程度と入門書より安価であるためそれを使って勉強することにしました。問題と選択肢に出てくる用語をひとつずつ検索し、公式サイトの概要を読み、個人や企業のブログをいくつか読んだりを繰り返して、メジャーなサービスや組み合わせくらいは学ぶことができました。試験を受けたところ合格できたので、ソリューションアーキテクトアソシエイトという認定の模試を使って同じように勉強しました。問われる内容が少し深くなるため、公式サイトでは開発者ドキュメントを読んで学びました。試験は合格しましたが、模試よりも難しくてより実践的な学習の必要性を感じました。
3月が始まって2週間程度経ち、入門はできたかなと思います。知らなかったことを知ると楽しくなってくるもので、いつの間にかAWSが好きになっていました。仕事でも使ってみたいなあ。
xv6ノートを書いた
去年の暮にxv6を読んだ。
年明けから体調が悪くて時間が空いてしまったけれど、読みながら書いたノートをmdbookでキレイにまとめて、GitHub Pagesで公開した。
6章以降は今後ちょっとずつ書いていく。
xv6ノート
https://kkmtyyz.github.io/xv6-notebook/
折角なのでGitHub Actionsを使ってみたけれど、これが無料で使えるのは本当にすごい。
surf::getでタイムアウトを設定する
環境
- cargo 1.47.0
- surf 2.1.0
- async-std 1.7.0
方法
async_std::future::timeout関数を使うとハッピーになれる。
以下は5秒以内にレスポンスが無ければタイムアウトするコード。
use std::error::Error; use std::fmt; use std::time::Duration; #[derive(Debug)] struct MyError(String); impl Error for MyError {} impl fmt::Display for MyError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) } } /// urlにgetリクエストする。 /// ステータスコードとbodyを返す。 async fn get(url: &str) -> Result<(surf::StatusCode, String), Box<dyn Error>> { match surf::get(url).await { Ok(ref mut res) => Ok((res.status(), res.body_string().await?)), Err(e) => Err(Box::new(MyError(e.to_string()))), } } /// urlへのgetリクエストを5秒でタイムアウトする。 fn get_timeout(url: &str) -> Result<(surf::StatusCode, String), Box<dyn Error>> { let timeout = async_std::task::block_on(async { async_std::future::timeout(Duration::from_secs(5), get(url)).await }); match timeout { Ok(res) => res, Err(e) => return Err(Box::new(e)), // タイムアウトしたときのエラー } } fn main() { let res = get_timeout("http://example.com"); let (status, body) = res.unwrap(); println!("{}\n{}", status, body); }