プログラマでありたい

おっさんになっても、プログラマでありつづけたい

2021年1月の目標

昨年の実績がダメダメだったので、初心に戻って月ごとの目標を立てていきます。いつまで続くか解りませんが、まずはやってみます。

2021年1月の目標

  • AWS 認定 高度なネットワーキング – 専門知識の取得
  • 序章を完成させる
  • 新規書籍の目次完了。メンバーが執筆レディの状態にする
  • 技術ブログを4本書く

AWS 認定 高度なネットワーキング – 専門知識の取得

12冠の最大の壁、AWS認定 アドバンストネットワーク – 専門知識の受験と合格目指します。試験範囲については、年末にまとめていて、1/15に受験するので勉強時間を15時間ほど確保する。平日1時間×8日と休日2時間×3日とどこかでプラスアルファ。ついでに勉強した内容をブログにまとめる

序章を2本完成させる

 昨年末に手をつけていた新刊の序章を完成させる。残り8,000字くらい

新規書籍の目次完了

 企画が完了している新規書籍の目次を完成させる。メンバーと担当箇所を割り振って、執筆可能な状態に持っていく

技術ブログを4本書く

 毎週1本を目安に技術ブログを書く。今月は、AWS認定アドバンストネットワークの勉強した内容を中心にまとめる。一本は、昨年まとめていなかったre:Inventの1行まとめ

その他

  • 毎日1万歩歩く。1月は31万歩
  • 仕事始める時に、1日分のToDoリストを作る
  • 本を5冊読む

2020年の振り返りと2021年の目標

 あけましておめでとうございます。今年もよろしくお願いします。
毎年恒例の、昨年の振り返りと今年の目標です。2020年の主な活動は、執筆3冊と登壇4回です。あと、AWSにアンバサダーでTop Japan Ambassadorsとして貢献度日本一と表彰されました。これだけ書くと順調のようですが、個々の振り返りをしてみると非常に苦しんだ1年です。

11,12冊目の本の出版と13冊目の執筆

 昨年の執筆実績は3冊です。と言っても、執筆に当てられる時間が少なく、純粋に書いた文字数ではここ数年の中で一番少なかったかもです。1冊目は、AWS認定セキュリティの試験対策本である、要点整理から攻略する『AWS認定 セキュリティ-専門知識』。こちらは初のマイナビ出版さんから刊行です。また執筆自体も、私は最初の企画と一章のナビの部分のみで、あとは殆ど会社の同僚の上野さんと小林さんの執筆です。初版の誤植などの問題はありましたが、内容的なクオリティは非常に高いと思っています。絶賛発売中です

 12冊目は、また技術同人誌です。前回はIAM本だったので、次はAWSアカウントセキュリティにフォーカスを当てています。物理開催される予定だった技術書典8に合わせて書いていたのですが、残念ながら物理開催は中止でオンラインで販売中です。まぁこれも、技術同人誌というカテゴリーの中ではかなり売れていると思います。合わせて技術書典9で、AWSのマルチアカウント本を書いて3部作完結とする予定でしたが、気力が尽きて書けていません。春までには書きたいですね

booth.pm

 13冊目は、AWS認定ソリューションアーキテクトの対策本の改訂です。2019年に書いたのに、2020年に試験が改訂されたのでそれに合わせての修正です。執筆が遅れて2021年1月の発売になってしまいました。そのため、10月過ぎくらいから在庫切れが続き、出版社にも購入希望者にも申し訳なかったです。すいません。

登壇

 昨年は登壇は4つと少なめです。新型コロナの影響というより、気力・体力の関係ですね。登壇すると自分自身の学びの効果も高く効率がいいのですが、なかなか手を挙げられませんでした。もともとは無理やり機会を作るために、地方の勉強会に参加しようと意気込んていたのですが、物理開催が難しくなり実現できずです。論理開催になったので、全国の勉強会に参加するチャンスはできたのですが、その辺りを活かせずですね。

『AWSの薄い本 IAMのマニアックな話』の輪読会

 登壇ではないのですが、唯一物理参加したのが輪読会です。自著の輪読会が開催されているのを知って、押しかけさせてもらいました。楽しかったです。都合があえば可能な限り参加するので、お気軽にお声がけください

blog.takuros.net

富山IT勉強会

 地方に旅行することをモチベーションに、勉強会に登壇の機会を増やそうと考えていました。ちょうど良いタイミングで富山であると知って参加予定でしたが、残念ながら新型コロナの影響で論理開催に。少人数でいろいろ話せたので、これはこれで良かったです。また参加したいです。

blog.takuros.net

Fin-JAWS

 AWS認定セキュリティの対策本の執筆記念にお声がけいただきました。Fin-JAWSは初参加だったのですが、金融クラスターの方々と話ができる良い機会でした。

speakerdeck.com

JAWS-UG朝会

 AWS OrganizationsとCloudFormation StackSetsの話をしたくて申し込みました。朝の時間を有効活用できるのは良いですね。またこの辺のテーマの話は、もっといろいろしたいです。

speakerdeck.com

Security-JAWS

 同じくAWS認定セキュリティの対策本の執筆記念にお声がけいただきました。テーマがFin-JAWSで話したのと同じだったのと、参加者の層もかぶっていたので、結果的に2回聞いたという人も多かったようです。この辺は工夫すべきでした。反省

speakerdeck.com

ブログ

 自分にとっての活動のバロメーターであるブログの投稿は、2020年は41本でした。2019年は26本だったので少し復調かなという気はしますが、月によってのばらつきがありコンスタントな活動ができていません。またブログのアクセス数は86,126と前年の202,257に較べて大幅減です。定期的な投稿していないと減るのよねぇと改めて実感です。今年は毎週1本くらいのペースに戻そうと思います

f:id:dkfj:20210102121538p:plain

 10年くらいのスパンでみると、低迷っぷりは明白です

f:id:dkfj:20210102121606p:plain

Japan APN Ambassadorで日本一

 唯一明るいニュースが、AWSのAPN Ambassadorで地域(日本)貢献度で一番ということで表彰されました。ありがとうございます。ちなみに一番順位が高い時は、世界で3位くらいでした。※

www.nri-net.com

 なお、今では同僚の上野さんに抜かれて、国内2位です。
※Ambassadorだけが入れるポータルがあり、そこでランク付けされています。

2020年の目標に対しての採点

本を3冊書く ⇒ ○ 一応3冊分書いたので良しとしましょう。今年は複数人で並行で進めているのを、一気に展開したい
Kindle本を書く ⇒ ○ IAM本とAWSアカウントセキュリティ本をKindle本として出してみました。少しだけ様子が解りました 
ブログ ⇒ ☓ 9万ビュー弱。昨年から半減以下。最盛期の1/10くらい。コンスタントに書く習慣が無くなってから駄目だ 
英語ブログ ⇒ ☓ 全く取りかかれず 
資格試験 ⇒ ☓ なんと一度も試験を受けず
英語 ⇒ ☓ 何もせず。。。

自己採点すると、もうダメダメです。このレベルになると、やろうとしている方向性と目標の立て方がずれていたということでしょう。

2021年の目標

  • 本を書く 自分中心ではなく、周りの人を巻き込んでの活動にします。2020年からこの活動はしているので、順調にいけば2021年には結構な本数を出せると思います。ただ、AWSの薄い本の三部作目は自分の手で完結させたいです。あと1冊ずっと出せていない本もちゃんと書かないと。
  • 動画コンテンツ 個人でやるか会社としてやるか、或いはその両方か検討中ですが、動画コンテンツに挑戦してみたいです。今までブログや書籍など活字コンテンツ中心だったので、違う市場というのを見てみたいというのが目的です
  • 資格試験 AWS認定試験12冠。これだけはちゃんと達成します。3月まで
  • ブログ ページビュー数を目標じゃなくて、毎週書くということを目標に再設定します。考えてみたらビュー数は結果ですし、忙しくても書くという習慣化が必要なのだと思います
  • IAM本を英語化&Kindleで全世界販売 世界の市場規模を知りたいので、これをやってみたい。2年ほど前から検討してたのですが、今年こそはやります。誰か手伝ってくれる人募集
  • 事業として考える 過去の執筆物が積み上がり技術同人誌の販売をしていて、経理とか含め片手間でやるのがしんどくなってきました。この辺り、一度ちゃんと税理士さんとかと相談できるような体制つくりたいと思っています。※ちゃんと毎年納税していますよ
  • Twitterのフォロワー5,000人 最近マーケティング的な動き方というのも模索しています。まずは自分ごとで始めるのが大事なので、Twitterのフォロワーを増やしてみたいです。現時点で2,600人なので倍の5,000人。かなり厳しいですが、方法考えてみます

まとめ

 全般的に不調な2020年でした。子供が地域の野球チームに入ったので、土日にそれの手伝いが必要など時間的な制約面が大きかったのかもしれません。が、それ以上にやる気がでなかったのが大きいと思います。理由の一つとしては、活動がマンネリ化していることだと考えています。執筆活動はそれなりにもう充分成果は出してきたと思うので、企画等の段階から含めて若者に任せていきたいと思います。その代わりに新しい挑戦をしていきたいです。具体的な内容については、計画立てて順次発表していきたいと思います。
 2021年も宜しくおねがいします

社内re:capでAWSの進化の話と、少しエモい話をしてきました

 所属する会社のグループ全体で、3週連続でAWSのre:Inventのre:capするということで、アンバサダーとして登壇してきました。登壇者の中で一番の高齢者層だったので、新サービスの発表についてでなく、昔話からの振り返り的な話をしています。

S3の歴史からみる「強力な書き込み後の読み取り整合性」について

 テーマに選んだのが、2020/12/03に発表されたS3の「強力な書き込み後の読み取り整合性」についてです。個人的には今回の新サービスの発表の中で、一二を争うくらいの凄い改善だと思うものの、なかなかその凄さが伝わっていないのかなと思います。ということで、歴史的な経緯から。

結果整合性

 はじめは結果整合性から。US Standardリージョンという耳慣れない言葉と一緒に紹介しています。いずれは最後に書き込んだ値になるけど、読み込むタイミングによっては最新の情報ではないかもというのが結果整合性です。

f:id:dkfj:20201227121056p:plain

 ちなみに最初期はS3にデータを転送するのにもお金がかかっていたんですよね。今は、Inの転送料は無料です。

「書き込み後の読み込み」整合性

 次に出てきたのが「書き込み後の読み込み」整合性です。新規のオブジェクト作成時は、即時に整合性が反映されているが、オブジェクトの上書きや削除については結果整合性というのが、「書き込み後の読み込み」整合性です。

f:id:dkfj:20201227121110p:plain

 US Standardリージョン以外はわりと早い時期にこれが利用できたので、S3の標準的な動作として捉えられていることが多いと思います。

「強力な書き込み後の読み取り整合性」

 今回発表された「強力な書き込み後の読み取り整合性」です。オブジェクトの上書きや削除の直後にも読み込みの整合性が保証されるようになりました。

f:id:dkfj:20201227121126p:plain

 ちなみに短いプレゼンの中で、「書き込み後の読み取り整合性」や「強力な書き込み後の読み取り整合性」を連発するのは辛いものがありました。舌噛みそうなのと、自分で何言っているのか解らなくなってきます。

結果整合性と「書き込み後の読み込み」整合性と「強力な書き込み後の読み取り整合性」のまとめ

 これらのS3の進化をまとめると、次の表のようになります。基幹となるサービスを着実に進化させてきているところに、AWSの底力を感じられますね。

f:id:dkfj:20201227121146p:plain

S3のプレフィックスと性能の話

 次にS3のプレフィックスと性能の話です。S3は、秒間のGetやPostなどの性能設定がされていることは割と知られています。しかし、正確にはプレフィックスごとの秒間の設定という条件があります。

f:id:dkfj:20201227121235p:plain

 この条件があるので、昔のAWSのベストプラクティスでは、プレフィックスの先頭にランダムな値をつけて分散させましょうというのがありました。S3のデータ配置のアルゴリズムと深い関係があるのでしょうね。

f:id:dkfj:20201227121250p:plain

 しかし、2018年のサービスアップデートでS3の基礎的な性能が大幅に向上したので、今ではほぼ無用の長物と化しています。しかし、今でもこのような設計の命名規則が残っていることも多く、最近の若者からしたら謎設計になっていると思います。というような話をしていました。

f:id:dkfj:20201227121307p:plain

 勘違いがないように補足しておくと、現在でもプレフィックスごとの性能設定というのは現状でも同じで、単に上限値が上がっているので不要なケースが増えているということです。

比較優位の話

 こんなことがあるので、AWSの知識は常にアップデートが必要なことと、それを一人でやるのは無理という話をしました。そのためには、みんなでアウトプットしましょうと。ただ、うちのグループ内って、スーパーマンみたいなに何をやっても凄い人が、まれによくいます。そんな人たちを見ていると、自分がアウトプットする必要ないじゃんというマインドになりがちになります。
 そんなことないですよ。みんなアウトプットしましょうということで、リカードさんの比較優位の話を軽く紹介しています。

f:id:dkfj:20201227121409p:plain

 時間の関係もあり、超絶端折ったスライドで煙に巻いている感もありますが、詳しい話はこちらをご参照ください。

ja.wikipedia.org

まとめ

 オンライン開催なのでよく解らなかったのですが、数百人規模の参加者がいたようです。CommentScreenによるコメントも活発で盛り上がってよかったです。また、これらの会が若手主体で、発表者も1〜2年目の人も多かったです。勢いを感じられるイベントで良かったなと思います

AWSのマルチアカウント管理ことはじめ ログインの一元化の設計

 日本のAWSのAPN Ambassadorが集まって作り上げるJapan APN Ambassador Advent Calendar 2020の初日です。佐々木の方からは、最近の関心事項であるマルチアカウント管理の中から、認証(ログイン)の一元化の設計について考えてみましょう。

マルチアカウント管理における認証(ログイン)の一元化の必要性

 AWSを本格的に使い始めるとすぐに直面するのが、利用するAWSアカウントの増大です。AWSのお勧めのプラクティスの一つとして、用途ごとにAWSアカウントを使い分けてリスクを下げるというのがあります。本番環境と開発環境が同居しているより、分離した上で使えるユーザーを役割ごとに限定した方がリスクを下げることができますよね。一方で、プロジェクトごと・環境ごとにAWSアカウントを分離していくとすぐに10や20のアカウントになってしまいます。その時に第一の課題となるのが、IAMユーザーの問題です。

f:id:dkfj:20201201084154p:plain


 AWSアカウントごとにIAMユーザーを作っていくと、ユーザーごとにIAMユーザーのIDとパスワードが10個も20個もできてきます。さらにAWSに携わる人が数十人いたら、数百のオーダーのID管理が必要となります。これを個々のユーザー任せで適切に管理することができるでしょうか?なかなか難しいのが現状で、放っておくと全部同じID・パスワードで運用されるといったことも発生しうるでしょう。そこで、必要になってくるのが認証(ログイン)の一元管理です。

認証の一元化のデザインパターン

認証の一元管理にも、AWSの機能のみで管理するパターンやサードパーティのツールを駆使するパターンなど幾つかあります。代表的なパターンを幾つかみていきましょう。

踏み台AWSアカウントパターン

 一番お手軽なのが踏み台AWSアカウントパターンです。踏み台となるAWSアカウントのみにIAMユーザーを発行し、後はクロスアカウントのスイッチロールでスイッチしていくパターンです。

f:id:dkfj:20201201084212p:plain

 このパターンは、踏み台となる一つのAWSアカウントのみにIAMユーザーを発行し、他のAWSアカウントにはIAMロールのみ発行します。踏み台にログイン後にスイッチロールを利用してそれぞれのAWSアカウントを利用します。スイッチされる側のIAMロールで、スイッチできるIAMユーザーを制限できるので各アカウント側で権限の制御ができるのがポイントです。また、このパターンだとAWS Organizationsで管理外のものでも簡単に利用できるというメリットもあります。ただし、スイッチ先の各アカウントでCLIを利用したい場合は、一工夫が必要となります。
 なお、このパターン名は、私が勝手に名付けているだけです。

サードパーティのIdP(Identity Provider)を利用するパターン

 次に紹介するパターンは、ある意味王道であるサードパーティのIdP(Identity Provider)を利用するパターンです。IdPは認証部分を専用のシステムに委託し、認証した結果を受け取ってAWSアカウントの利用を許可するパターンです。IdPを利用するとAWS側でID/パスワードの管理が不要になります。代表的なIdPとしては、Microsoft Active Directory(AD)やGoogle Workspace(旧G Suite),Okta,OneLoginなどがあります。

f:id:dkfj:20201201085741p:plain

 IdPを利用するパターンも、AWS部分はIAMロールを使います。そのため、踏み台AWSアカウントパターンと構成的には大きく違わないように見えます。しかし、ポイントはAWSアカウント内に一切IDとパスワードを持つ必要がない点にあります。AWSを使うような組織は、AWS以外にも様々なシステムを利用し、ID/パスワードを管理する必要があります。そこにAWSのID管理を統合できるのは大きなメリットです。一方で、踏み台AWSアカウントパターン同様にCLIを利用したい場合は一工夫が必要です。

AWS SSOを利用するパターン

 3つ目のパターンとしては、AWS SSO(AWS Single Sign-On)です。AWS SSOは、その名の通りマルチアカウントでのAWS運用を想定したサービスです。AWS SSO用のログイン画面があり、ログイン後に自身が利用できるAWSアカウントを選択できるようになっています。

f:id:dkfj:20201201091712p:plain

 構成的には、IdPパターンと大きく変わりませんが、メリットは幾つかあります。そのうちの1つが、SSOから利用しているユーザーもCLI(v2)が使えることです。もう一つは、アクセス権限セットという機能を使って、複数アカウントのアクセス権限を一元管理できることです。ただし、SSOの利用はAWS Organizationsが前提となります。それにしても、これいいじゃんってなりますよね。ただ、お勧めの使い方としては別パターンがあるので、SSOのアクセス権限セットを説明の後で紹介したいと思います。

AWS SSOのアクセス権限セット

 先程紹介したどのパターンでも、IAMロールが肝になっているのが解るでしょうか?認証の一元化はできても、どの機能が使えるかという認可の部分については各アカウントに設定されたIAMロールに依存することになります。そのため、個々のアカウントにIAMロールを設定していくという作業が必要になります。AWS OrganizationsとCloudFormation StackSetsを使えばこの辺りの作業もだいぶ楽にはなりますが、一元管理とは少し遠い世界です。
 そこで登場するのがAWS SSOのアクセス権限セットです。アクセス権限セットはユーザーごとのアクセス権限を一元管理する仕組みです。SSOを設定するOrganizationsの管理アカウント(旧マスターアカウント)で定義します。アクセス権限セットと呼ばれるポリシーを作成し、ユーザーがどの権限を利用できるかを紐付けます。管理者の操作としてはこれだけなのですが、アクセス権限セットの良いところは、裏で対象のAWSアカウントの方に、アクセス権限セットと対応するIAMロールを作っているということです。まさしく一元管理!!

お勧めのデザインパターン IdP + AWS SSO

 アクセス権限セットとCLI対応の2点でAWS SSOがお勧めです。一方で、いろいろな現場でSSOを紹介しても、やっぱり既存のIdPを使いたいというケースが多いです。やっぱりIDの二重管理は嫌ですもんね。そんな時にお勧めがIdP + AWS SSOというパターンです

f:id:dkfj:20201201093752p:plain

 構成としては、ユーザーはIdPでまず認証します。認証後にAWS SSOのポータル画面に移動します。そして、任意のAWSアカウントに移動するというパターンです。画面遷移が一つ増えるという手間が増えますが、このパターンには大きなメリットがあります

  • ID管理をAWS以外も含めて一元化できる
  • 認証(IdP)と認可(アクセス権限)を明示的に分離できる
  • AWS SSOの機能が100%利用できる
  • 今後AWS SSOの機能が増えてもグヌヌとならない

まとめ

 AWSのマルチアカウント管理については、踏み台AWSアカウントあたりから始める人が多いのではと思います。コストも掛からないので、それで充分な場合も多いです。一方で大規模になると辛くなるということもあります。そんな際の参考になれればなと思います。
 じつはこの辺の話をAWSの薄い本Ⅲとしてまとめようと思いつつ、はや半年が過ぎました。1行もかけていません。年内に執筆在庫を一層して、年初あたりから取りかかれればと思っておりますので、生暖かい目で見守ってください。また、AWS SSOを使う上では、Organizationsが必須となります。請求代行使っててOrganizations使えないよという方は、Organizations対応の支払い代行とかしているところを検討するといいんじゃないかなと思います。(ステマ)
 今回は論理設計の話が中心だったので、もう少し具体的な話を今後紹介していきます。乞うご期待!!

www.nri-net.com


booth.pm

booth.pm

S3のマイナー機能の四天王候補の一つであるS3 オブジェクトロックの機能について

 Amazon S3の正式名称は、Amazon Simple Storage Serviceです。Simpleを辞書で紐解くと、次のような言葉が出てきます。

1. 易しい、難しくない
2. 簡素な、簡略した、シンプルな
3. 質素な、地味な、豪華でない
4. 単一の、一つだけで構成される
5. 単純な、複雑でない
6. 〔人が〕気取らない、控えめな、見えを張らない
7. 〈軽蔑的〉〔知的レベルが〕単純な、ばかな
8. 〈軽蔑的〉教養がない、無知な
9. 〔人が〕素朴な、洗練されていない
10. 〔人が〕真面目な、誠実な、うそをつかない
11. 普通の、いつもの、ありふれた
12. 基本の、初歩の
13. ささいな、重要でない、つまらない
14. 《植物》単一の◆【対】compound
15. 《化学》〔化合物が〕単純な
16. 《言語学》〔文構造が〕単純な

引用元 英辞郎 on the Web

 AWSの認定試験を受けていると、普段あまり使わないような機能がどんどん出てきて、Simpleってなんだろうと哲学的な気分になります。昔、大阪でインド人がやっているカレー屋で辛そうに食べていたら、インド人に「辛くない〜、辛くな〜い」と励まされた事も思い出されます。シンプルなのかシンプルじゃないのか、辛いのか辛くないかは、人それぞれということですね。

 前置きが長くなりましたが、今回のテーマは、数あるS3の機能の中で一般的な機能要件ではまず使うことがないオブジェクトロックの機能についてです。

S3のオブジェクトロックの概要とそのニーズ

 S3のオブジェクトロックは、雑な言い方をすると指定されていると何があっても変更したり消せなくする機能です。モードによりますが、管理者であっても消せなくなります。何故、そのような機能が求められるのかというと、コンプライアンス対応です。業種・業界によっては、一定期間データを保持し続けないといけないとルールで定められているものがあります。ルールの多くは、データの完全性を求めていて、期間中のデータ変更や削除を防がないといけません。そんな時に、どうしたらいいでしょうか?
 ぱっと思いつくのは、データにアクセスできる場所と人を限定することです。しかし、その場合は期間中のそのデータへのアクセス履歴とともに、データにアクセスできる人の行動履歴を残し続けないといけません。また、履歴データ自体も改ざんされていないことを証明することが必要です。結構、大変ですよね。そこで登場するのがS3のオブジェクトロックの機能です。これはAWSによって、期間中は一切変更・削除できないということを保証する機能です。利用者は、対象データが確かにその設定がされていることだけ確認するだけで良くなります。格段に楽になりますよね。

S3のオブジェクトロックの機能

 S3 オブジェクトロックは、リテンションモードリーガルホールドの2つを利用できます。どちらか一方を利用することも、両方を利用することも可能です。まずここからして、オブジェクトロックが解らなくなります。順を追って説明します。

リテンションモードの2つのモード

 リテンションとは、保持とか維持するという意味です。オブジェクトを保護しますよという機能ですね。リテンションモードは2つのモードを提供しています。

  • ガバナンスモード
  • コンプライアンスモード

 ガバナンスモードは、特別なアクセス許可を持つユーザー以外は、オブジェクトのバージョンの上書きや削除、ロック設定を変更することはできません。つまり、限定したユーザーだけは変更・削除できるということです。続いて、コンプライアンスモードは、AWSアカウントのルートユーザーを含めて、指定期間中は対象のオブジェクトのバージョンを上書きまたは削除、ロック設定の変更をすることはできません。結構強烈な機能ですね。

保持期間

 リテンションモードには、保持期間が設定されます。これはバケット単位で○○日までというような設定ではなく、オブジェクト単位に何日保持するかというような指定です。例えば、ルールで1年間保持しないといけないのであれば、365日と指定します。

リーガルホールド

 オブジェクトロックは、リテンションモードとは別にリーガルホールドというオブジェクトを保護する仕組みがあります。リテンションモードとの違いは、保持期間がないという点です。削除するためには、リーガルホールドの適用を解除する必要があり、s3:PutObjectLegalHold を持つユーザーがその設定をできます。つまりS3のFullAccessをもっていると、リーガルホールド対象のオブジェクトは直接は消せないけど、ひと手間掛けると消せるということになります。リテンションモードよりは少し弱い保護となります。

リテンションモードとリーガルホールドの組み合わせ

 さて、ここからが地獄です。リテンションモードとリーガルホールドは何故か排他の設定ではなく組み合わせることができます。設定のパターンとしては、以下のパターンが可能です。

  • オブジェクトロックなし(デフォルトの状態)
  • リテンションモードのガバナンスモード
  • リテンションモードのコンプライアンスモード
  • リーガルホールド
  • リーガルホールドかつリテンションモードのガバナンスモード
  • リーガルホールドかつリテンションモードのコンプライアンスモード

 AWSの認定試験でここまで問われることは無いと信じています。ただ、オブジェクトロック機能がリテンションモードとリーガルホールドの2つの機能があることと、それの違いを理解していないと混乱するでしょう。事実、試験のたびにどうだったかなぁと頭を悩まします。

オブジェクトロックを利用する方法

 オブジェクトロックの概要はだいたい理解できたかと思います。それでは、実際にどう設定すればいいのでしょうか?たぶんこの記事を読んでいる人の9割8分3厘は実際に設定することがないと思いますので、詳細は省きます。下記の2点が必要という事を覚えておいてください。

  • バケット設定でオブジェクトロックの有効化
  • オブジェクト単位で保持期間やリーガルホールドの設定

 バケット設定でオブジェクトロックを有効化して、その後にオブジェクト単位で設定していくという流れです。注意点としては、バケット設定で有効化するには新規作成のバケットのみで指定できるという点です。既存のバケットに対しては、サポートにお願いすると有効化してくれそうな雰囲気ですが、試したことはないです。またオブジェクトロックを利用する場合は、バージョニング設定が必須となります。

f:id:dkfj:20201019015129p:plain

デフォルトの保持設定

 先程、バケットでオブジェクトロックを有効化されても、オブジェクト単位で指定する必要があると説明しました。いやいや、それは面倒くさいという人のために、デフォルトの保持期間が設定可能です。なお、画面コンソールから指定できるのは、リテンションモードのみです。

f:id:dkfj:20201019022006p:plain

オブジェクトロックされたファイルの消し方

 最後にオブジェクトロックされたファイルの消し方をまとめておきましょう

  • リテンションモードのガバナンスモード

  保持期間明けまで待ってから削除
  特別なアクセス許可を持つユーザーでガバナンスモードを解除してからオブジェクトを削除

  • リテンションモードのコンプライアンスモード

  保持期間明けまで待ってから削除

  • リーガルホールド

  IAMで権限を持つユーザーでリーガルホールドを解除してからオブジェクトを削除

 リテンションモードとリーガルホールドは併用できるので、その場合はそれぞれの条件を満たす必要があります。こうやってみると、リテンションモードのコンプライアンスモードの制約の大きさが解りますね。退職前にコンプライアンスモードの設定で保持期間をこっそり10年とか指定するのは、テロに等しいのでやめましょうね。

まとめ

 S3のマイナー機能の四天王候補の一つであるオブジェクトロック機能です。機能を知ると、よく考えられているなぁと感心します。ただ、ここまで求められる要件がでてくるのは、ごく一部の業界のみで大半の人は使わずに終わるのではないかなぁと思います。そんな業界に飛び込んだあなたは、ラッキーと思ってドヤ顔で使いましょう。私は、残りの四天王の3つを探す旅にでることとします


AWSのロードバランサ、CLB, ALB, NLBの機能差まとめ

いい加減に12冠にならないとなぁということで、スキマ時間にちょっとづつ勉強しています。隙間時間だと、前回勉強したところの続きに戻るまでに隙間時間が過ぎてしまう辛みがありますが、皆さんいかがお過ごしでしょうか?

 私にとっての最鬼門のAWS認定アドバンスドネットワーク専門知識の試験範囲の確認のために公式トレーニングの試験対策を見ています。AWSの試験で一番わからないのが、どのサービスが対象範囲なのかという点だと思います。これを受けることにより、ここを勉強すればよいのだというのがはっきりするのでお勧めです。
Exam Readiness: AWS Certified Advanced Networking - Specialty (Digital)

 その中で、AWSのロードバランサであるELB(CLB, ALB, NLB)のまとめ表があったので紹介しておきます。

3種類のELBの違いを1枚の図でまとめる

 みなさん、3種類のELB(CLB, ALB, NLB)の違いを説明できますでしょうか?CLBはTCPとHTTP,HTTPSが使えて、ALBはHTTP,HTTPSだけでNLBはとか頭の中を駆け巡ると思います。その辺を一枚の表にしておけばもう悩みません。常々作ろうと思いつつ、既にまとめてあったので紹介させて貰います。どん!!

f:id:dkfj:20201013115235p:plain

※2020年10月13日 11:55追記 
優しいマサカリが飛んできたので、図を修正しています。NLBも2019年1月よりTLS Terminationが出来るようになっています。Container Supportについてはもう少し補足が必要なので、Container Native Supportに変更の上で、下に補足を書いています。

 図の項目名で、一部分かりづらいものがあるので補足しておきます。

Protcol

 どのプロトコルを受け付けるかですね。NLBはレイヤー4のサービスなのでTCPのみです。ALBはレイヤー7でHTTP,HTTPSの他にHTTP/2も受け付けます。CLBはそういえばSSLも受け付けましたね。UDPについては言及なしの世界線です。

SSL offloading

 SSLオフロードは、TLSまたはSSLの通信を紐解いて後ろに平文の通信で流すという機能です。現実的にはSSLはもう使わないのでTLS offloadingというのが正しいのでしょうね。CLBとALBがもともと対応していましたが、NLBも対応しました。つまりこの観点では、どれを使っても大丈夫。これがないと、個々のWebサーバーに直接SSLの証明書をそれぞれ入れないといけないので不便です。試験問題だと逆に、Webサーバからアプリケーションサーバ間の通信も暗号化したままにしたいというのがあるので、頭のひねりどころですよ

IP as target

 これは言葉にすると解りづらいのですが、ターゲットグループにIPを指定できるかという事です。一般的にはインスタンスを指定すると思いますが、ALBとNLBはローカルIPアドレスを指定できます。これ使うと、VPNやダイレクトコネクト先の(嬉しいかどうかしりませんが)オンプレサーバを指定するといったことも可能です。オンプレに対して使うかどうかは別として、設計の幅が広がるのは確かです。リバースプロキシ立ててたけどっていうのを、NLBやALBで代替できるケースも多数あるでしょうね。

Path-based routhing, host-base routing

パスベースのルーティングというのは、example.com/imageやexample.com/contentsなどドメインの後の/以下の部分を判断して振り分けるという機能です。ホストベースのルーティングは、app.example.comやimage.example.comといったようにサブドメイン部分を判断して振り分けるということです。これが出来るのは、ALBだけです。そもそもCLBはELBとターゲットは1対1の紐付けしかできません。ALBは、1対多の紐付けができます。便利ですねぇ~。その気になれば、複数のシステムでALBを共有してコスト削減できますが、システム同士が密結合になるので止めた方がよいですね。

Static IP

 パスベース・ホストベースのルーティングができるのがALBの売りですが、このStatic IPの機能がNLBの売りの一つです。このStatic IPはロードバランサーに固定のIPアドレスを設定できます。ALBやCLBはURLベースでしたが、NLBは固定のIPを指定できます。これが利点になることが多いです。IPを固定したいという用途がある時に、前にNLBを置くことにより解決することができます。

WebSockets

 WebSocketsはシンプルに対応しているかどうかですね。ALBとNLBが対応しています。

Container Support

 Container Support。これは、ECS等に対応している「仮想マシンでのホップなしにコンテナネイティブなルーティングができる」かという点です。細かくケース別にわけると長くなるので、別途まとめようと思いますが、ALBとNLBが対応しています。単純なルーティングだけであればCLBでも一応使えます。

まとめ

 AWSはCLB, ALB ,NLBと3種類もロードバランサがあって解らんよという方もいると思います。まずは、この表で頭の中を整理してみるのも良いのではないでしょうか。ただ実質CLBはリタイアしていく運命のサービスですから、ALBとNLBだけ覚えれば充分です。WebサイトのロードバランスにALB、それ以外の用途はNLBとなることが多いです。原則のALB覚えて、それに対応できないケースを解決しているNLBになります。NLBの構成図を見ると、なるほどなぁとなることが多いです。一度、目を通してみると良いですよ

AWSのS3のバージョニングとライフサイクルの組み合わせについて

 S3を使っていて、初見でイマイチ腑に落ちないのが、バージョニングです。このバージョニング機能は、その名の通りオブジェクトの履歴管理を行いオブジェクトが更新されるたびに新たな履歴として追加していきます。これが腑に落ちないとなるのは、何ででしょうか?順番に説明していきます。

f:id:dkfj:20201005080025p:plain

バージョニングとライフサイクルの機能解説

 まずはS3のバージョニングとライフサイクルの機能の概要を見ていきましょう。どちらも考え方としては、非常にシンプルです。

S3のバージョニングの機能

 S3のバージョニングを有効にすると、オブジェクトの更新履歴を保持します。保存期間・世代数はバージョニング機能で指定できないので、永遠に保持し続けます。まず、ここが最初の?となるポイントです。保存期間・世代数の指定方法を無しに、どうやって制限するのと思うのではないでしょうか?AWSは、そこをライフサイクルという別の機能でカバーしています。

S3のライフサイクル機能

 S3のライフサイクルを使うと、ルールに従ってストレージクラスの変更とオブジェクトの削除ができます。また、対象は「現行バージョン」と「以前のバージョン」をそれぞれ指定可能です。ここで、「以前のバージョン」を指定することによりバージョニングを有効にした場合のオブジェクトの管理ができます。バージョニング設定はオン・オフしかできなくて、過去バージョンを管理するのがライフサイクルという別の機能というのがAWSらしい設計思想です。
 では、実際にライフサイクルの画面をみて確認してみましょう。ファイルの削除は「有効期限」の設定画面で失効の設定を行うことによりできます。バージョニングによる過去の履歴ファイルを消したい場合は、「以前のバージョン」をチェックの上で、○○日以前のオブジェクトを消すか設定します。

f:id:dkfj:20201005090950p:plain

 この時点で、また疑問が出てくると思います。バージョニングとライフサイクルの組み合わせで、例えば何世代残すという設定はできないのでしょうか?答えとしては、S3の機能だけではできません。S3のバージョニング機能とライフサイクルのファイル削除機能でできるのは、過去の更新履歴を残し続けること、一定期間が過ぎたオブジェクトを消すことの、シンプルな2点のみです。

f:id:dkfj:20201007132938p:plain

ユースケース別にS3のバージョニング機能の適合性を考える

 S3のバージョニング機能とライフサイクル機能を抑えたうえで、じゃぁどういったパターンで使うのかという話になります。よく聞かれるケースを3つほど紹介してみます。

ケース1 Gitのようなタグやブランチで管理したい

 無理!!

素直にGit系のサービスを使ってください。AWSだったらCodeCommit

ケース2 バケット内の全てのファイルを、1世代前のオブジェクトに戻したい

 出来るけど、たぶんやりたい事と違う動きになる

スクリプトを組んで、全部のオブジェクトを1世代前に戻すことは可能です。でも、S3の世代の概念は、オブジェクトごとです。そのため1世代前のファイルが3日前に更新されたものもあれば、1年前ということもありえます。そんな状態で1世代前に戻しても意味がないです。

ケース3 バケット内の全てのファイルを、特定日付のオブジェクトに戻したい

 出来なくはないけど、自分で実装が必要

オブジェクトごとに履歴があって日付の情報もあるので、一つづつのオブジェクトに対して調べてバージョン指定で戻すということで実現ができます。ただし、対象ファイルが多いと手作業で出来るものではないので、何らかのプログラムが必要になります。何が事があってからでは厳しいので、そういったことが必要であれば事前に作って検証しておきましょう。

まとめ

 S3のバージョニングとライフサイクルの話でした。AWSらしくそれぞれの機能はシンプルです。その特性を使ってどうするかというは、料理人の腕次第です。個人的には、バックアップと特定日での戻しに関して言うと、S3と連携する専用のバックアップソフトを使うことをお勧めです。また、静的Webサイトに多いリリース前に戻したいという要件は、複数のバケットを使ったBlue/Greenデプロイを使うのがいいんじゃないかなと思っています。現場からは以上です。