プログラマでありたい

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

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デプロイを使うのがいいんじゃないかなと思っています。現場からは以上です。

AdministratorAccess権限を持ったIAMユーザーでも閲覧できないS3バケットの消し方

 AWSのS3のマネジメントコンソールを見ていると、アクセスタイプで絞り込むことができることに気が付きます。絞り込みの条件として、「公開」や「オブジェクトは公開可能」など5種類あり、その中の一つに「エラー」というものがあります。今日は、このエラーというバケットが何者なのかというのと、それを無理やり消すための豆知識をお伝えします。

エラーが表示されるS3バケットは何者なのか?

 まずこのエラーと表示されるS3バケットが何者なのかという話からです。これは、S3のバケット一覧・詳細を表示しようとしているIAMユーザーもしくはIAMロールの権限とバケットポリシーの組み合わせで表示する権限がない場合に発生します。バケットポリシーも考慮するので、たとえ制限のないAdministratorAccessの権限を持っている利用者でも発生する場合があります。

 ちょっとイメージが付きにくいと思うので、具体的な例で紹介します。
手元にあった表示できないS3のバケットです。
f:id:dkfj:20201001001236p:plain


 バケットを選択の上で、概要を見ようにもAccessDenyになっています。
f:id:dkfj:20201001001345p:plain

 このバケットのバケットポリシーがどうなっているかを見てみましょう。
特定のVPCエンドポイント経由からのアクセス以外はすべて拒否するようにしています。

{
    "Version": "2012-10-17",
    "Id": "Policy1415115909152",
    "Statement": [
        {
            "Sid": "Access-to-specific-VPCE-only",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::tmp-test1234/*",
                "arn:aws:s3:::tmp-test1234"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpce": "vpce-xxxxxxxx"
                }
            }
        }
    ]
}

 極めて機密性が高いデータや個人情報を含むものについては、IAMのアクセス権のコントロールのみならずバケット側でも制御することは必須となります。その際の選択肢として、そのデータを活用するシステムが格納されている特定のVPCからのみ制御はよくあるんじゃないでしょうか。

 そして、ここからが本題です。こういった制御はVPCエンドポイントのID等を指定します。そのエンドポイントが消してしまったり、指定の仕方がを間違えた場合はどうなるのでしょうか?答えは、誰も見えない消せないバケットの誕生です。ということで、そうならないように気をつけましょう!!

AdministratorAccess権限を持ったユーザーでも消せないバケットの消し方

 気をつけましょうで終われれば、世の中システム障害や謝罪会見は発生しません。気をつけても現実には起こりうるので、その時の対処法です。AdministratorAccess権限を持ってしても消せないのは、バケットポリシーによって制限されているからです。解決策としては、そのバケットポリシーを消せばいいのです。ということで、AdministratorAccess権限を持ったIAMユーザーで、バケットポリシーを表示してみましょう。

f:id:dkfj:20201001002202p:plain

 はい。無慈悲にも何も表示されませんし、保存・削除ボタンも押せません。では、どうしたらいいのか?実は、ルートユーザーであれば、どんな状態でもバケットポリシーの編集だけは出来るのです。

f:id:dkfj:20201001002441p:plain

 ということで解決策としては、ルートユーザーでバケットポリシーを削除するです。なお、ルートユーザーでもバケットポリシー以外の部分はすべてAccess Denyのエラーがでて、表示することができません。

 その他の解決策としては、AWSのサポートに問い合わせてみるというのもあるかと思います。過去、どうやったのか忘れたのですが、どうやっても消せないバケットが出来たこともあったような気がします。その時にサポートに聞いた記憶があるので。(遠い昔の話で、全く覚えていないですが)

まとめ

 結論としては、シンプルです。AdministratorAccess権限を持ったIAMユーザーでも消せないS3バケットを作ってしまったら、ルートユーザーでバケットポリシーを消しましょう。ちゃんちゃん

AWSのEC2 インスタンスメタデータサービスのv1(IMDSv1) とv2 (IMDSv2) の違いと効果

 SecurityHubにIMDSv2にしろよと警告が出るようになった今日この頃です。そこで、そもそもIMDSv2って何という疑問があるので、簡単に解説してみます。IMDSv2は、インスタンスメタデータサービス Version 2です。iPhone 3Gの前は無印のiPhone(初代)ですが、version 2ということはversion 1があります。v2 (IMDSv2) が出てきた経緯と、その動作の違い等についての豆知識です。

インスタンスメタデータとは?

 インスタンスメタデータとはインスタンスに関する情報(データ)で、実行中のインスタンスからcURLなどのツールからリンクローカルアドレス(http://169.254.169.254)を呼び出すことで取得できます。取得できる情報とては、インスタンスIDや自身のIPアドレス、所属するセキュリティグループなどです。インスタンスの中で実行するプログラムあるいはAWSの各種サービスが、この情報を使って何らかの処理をする時に利用します。

 v1とv2の違いは、取得の仕方です。

v1は次のように単純にURLを叩くだけで取得できます。

curl http://169.254.169.254/latest/meta-data/

v2は、リクエストのヘッダーに有効期限などを元にしたトークンを埋め込む必要があります。

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/

Capital Oneを襲ったSSRF攻撃とインスタンスメタデータ

 それでは何故v2は、わざわざトークンを埋め込んで取得しにくくしているのでしょう?その背景を知るために、Capital Oneを襲ったSSRF攻撃の事件を紹介します。事件の概要を簡単に説明すると、攻撃者はWAFの脆弱性を利用してIAM Roleが設定されているインスタンスにServer Side Request Forgery(SSRF)攻撃を仕掛け、インスタンスメタデータを利用してIAMのクレデンシャル情報を取得しました。そのクレデンシャルを利用して、S3にアクセスして大量のデータを盗んだという事件です。

f:id:dkfj:20190812151512p:plain

Capital Oneの個人情報流出事件に思うこと - プログラマでありたい

 この事件には幾つかポイントがあるのですが、そのうちの一つがインスタンスメタデータを通じてIAMロールの一時的なアクセスキー・シークレット(クレデンシャル)が取得され、それを悪用された事にあります。

f:id:dkfj:20200930094358p:plain

 インスタンスメタデータからクレデンシャルを取得できる事自体は、インスタンスメタデータサービスの仕様なのでそれ自体は問題ありません。問題は、そのデータが簡単に取得できるので、SSRF攻撃を受けた時に悪用されやすいという点です。その改善としてv2が出てました。v2がもともと計画していたのか、Capital Oneを受けて作ったのかは不明です。ただGCPのメタデータの取得はv2的な動きで、AWSもそうして欲しいという話は以前からありました。

インスタンスに対してv1・v2を指定して設定する

 インスタンスメタデータサービスのバージョンの指定は、インスタンス起動時に指定できます。v2が出た当初は、CLIでの起動のみ指定可能ですが、今だとマネジメントコンソールからでも指定できるようになっています。インスタンスの詳細設定の高度な詳細(どんな日本語だよ)のMetadata Versionで指定できます。デフォルトはv1とv2の両方を使えるもので、v2のみ使えるものも指定できます。また、Metadata accessibleで、メタデータ自体にアクセスできないようにすることもできます。

f:id:dkfj:20200930095414p:plain

v1とv2の挙動の確認

 それでは、実際にv1とv2の設定をしたインスタンスで、それぞれの挙動を確認してみましょう。まずは、v1設定のインスタンスです。

単純なcurlコマンドでの取得

$ curl http://169.254.169.254/latest/meta-data/ami-id/
ami-0ce107ae7af2e92b5

 成功しますね。
次にv2に対応したトークン埋め込みでの取得

$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-id/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 56 100 56 0 0 11200 0 --:--:-- --:--:-- --:--:-- 11200

Trying 169.254.169.254...

TCP_NODELAY set

Connected to 169.254.169.254 (169.254.169.254) port 80 (#0)

> GET /latest/meta-data/ami-id/ HTTP/1.1
> Host: 169.254.169.254
> User-Agent: curl/7.61.1
> Accept: */*
> X-aws-ec2-metadata-token: AQAAAMVnM-DonAFD57_6PRycSd7L-6KgnwwOK2i352oj2ir7dYa85g==
>

HTTP 1.0, assume close after body

< HTTP/1.0 200 OK< Accept-Ranges: bytes< Content-Length: 21< Content-Type: text/plain< Date: Tue, 29 Sep 2020 15:32:45 GMT< Last-Modified: Tue, 29 Sep 2020 15:03:15 GMT< X-Aws-Ec2-Metadata-Token-Ttl-Seconds: 21600< Connection: close< Server: EC2ws<

Closing connection 0

 見え方が違うけど、成功しています。
v1,v2のどちらのコマンドでも取得できることが確認できました。

次にv2設定のインスタンスで、v1で取得する際に利用する単純なcurlコマンドでの取得してみます。

$ curl http://169.254.169.254/latest/meta-data/ami-id/
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>401 - Unauthorized</title>
 </head>
 <body>
  <h1>401 - Unauthorized</h1>
 </body>
</html>

 401 Unauthorizedで権限がないためにエラーがでています。
ということで、v2に設定しているとトークンを埋め込まないと取得できないことが解りました。

 v1からv2に変更する場合、AWSの機能・サービスで呼ぶ出しているところは影響ないですが、自前でメタデータを取得するプログラム・コマンドを作っている場合は変更が必要です。

v2 (IMDSv2) を設定した場合のセキュリティ的な効果は?

 それでは、v2 (IMDSv2) を設定するとセキュリティ的にどういった効果があるのでしょうか?AWSやクラスメソッド臼田さんのブログにある通り、幾つかの効果があります。

  • 誤って設定された Web アプリケーションファイアウォールからの保護
  • 誤って設定されたリバースプロキシからの保護
  • SSRF 脆弱性からの保護
  • 誤って設定されたレイヤ3ファイアウォール、NAT 機器からの保護

 v2を使うと何故防げるのかというと、ヘッダーを検証するようになっているのでX-Forwarded-Forが入っているとトークンを発行しないなどの幾つかの仕様がはいっているためです。詳しくはブログを確認してください。

aws.amazon.com

dev.classmethod.jp

実際、どれくらいの効果があるのか?

 それでは、v2 (IMDSv2) にした場合にどれくらいの効果があるのでしょうか?これはSSRF等の防止策ではなく緩和策と認識しています。つまり単純な攻撃からの被害を防げるけど、もっと本気を出した攻撃は防げません。このあたりは徳丸さんが詳細指摘しています。

blog.tokumaru.org

 対策として大事なのは、設計レベルでそれぞれのサービスに防御を盛り込むことだと思います。例えば、インスタンスに付与するIAMロールには最小権限に絞るとか、取得される先のS3バケットはバケットポリシーで接続元を絞り込むなどがあります。このあたりは、過去にまとめています。

blog.takuros.net

 今後作るインスタンスについては、v2 (IMDSv2) にすべきだと思います。またIAMポリシーで、IMDSv2を強制するということもできます。ただし、その設定をしていれば安心という代物ではないということはしっかり認識しておきましょう。それぞれのレイヤーで、出来うる限りの設計・防御をしていくという観点をもっていきましょう。でもIAMとかAWSのセキュリティサービスが解らんという方は、お勧めの本がありますよというステマで終わらせて頂きます。現場からは以上です!!

booth.pm

booth.pm

ファイルストレージ・ブロックストレージ・オブジェクトストレージの違いと、AWSのストレージサービスとのマッピング

 こんにちは。仕事でAWSの構築し、プライベートでAWSの研究と技術書の執筆をし、Amazonで本を売っているAmazon依存症疑惑のある佐々木(@dkfj)です。
 AWS使い始めてまず悩むことのベスト10の一つが、ストレージサービスの選び方です。AWSにはS3やEBSの他に、EFSやFSxなど多種多様なストレージサービスがあります。今回は、ストレージサービスの種類から、AWSのサービスの使い分けを説明したいと思います。

ストレージサービスの種別

 一口にストレージといっても、用途に応じて幾つか分類できます。代表的なのが、ファイルストレージ・ブロックストレージ・オブジェクトストレージです。まずは、この3つの違いをみてみましょう。

ブロックストレージ

 まず一番イメージしにくいのが、このブロックストレージ。ブロックストレージは、ものすごくザックリいうとハードディスクのようなもので、ブロックと呼ばれる論理単位でのアクセスします。ハードディスクは物理的な単位に制約されますが、クラウドのブロックストレージはバックエンドのストレージを論理的にまとめて好きな単位に切り売りしてくれます。人間が直接扱うというより、OSとかが使う低レイヤーなストレージになります。

ファイルストレージ

 次にファイルストレージとは何かです。こちらはいわゆるファイルサーバーのようなイメージです。ユーザーは、ストレージ上のデータを個々のファイル単位で扱います。OSを介して見えるのがファイルストレージですし、それをネットワーク越しに利用するのがNAS(ネットワーク・アタッチト・ストレージ )です。

オブジェクトストレージ

 最後にオブジェクトストレージです。字義的には、データをオブジェクト単位で扱うストレージです。これだと、ファイル単位で扱うファイルストレージと何が違うのだという気がしますが、その通りです。ディレクトリ構造で管理するファイルストレージと違い、オブジェクトストレージはオブジェクトを一意に識別するIDと、それを管理するメタデータで構成されています。さらにS3のようにアクセスするためのAPIが提供されているケースもあります。というか、オブジェクトストレージの概念と実装は、S3の存在が大きいんですね。知らなかった。

ストレージ種別のまとめ

 ブロックストレージ⇒ファイルストレージ⇒オブジェクトストレージとレイヤーが上がってくるイメージですかね。この辺りRedHatさんが上手くまとめています。流石、ストレージ会社の側面がありますね。

www.redhat.com

ストレージ種別とAWSのサービスのマッピング

 ストレージ種別の概要がザックリ解ったところで、AWSのサービスをマッピングしてみましょう。

ストレージ種別 サービス名 概要
オブジェクトストレージ S3 AWSが誇るオブジェクトストレージ
オブジェクトストレージ Glacier S3のストレージクラスの一部に取り込まれたアーカイブ用ストレージ
ブロックストレージ EBS 不揮発性のストレージ
ブロックストレージ EC2のインスタンスストア 揮発性のストレージ
ファイルストレージ EFS NASみたいに複数のインスタンスからマウントできる
ファイルストレージ FSx for Windowsとfor Lustreの2種類があるよ

ファイルストレージの使い分け

 オブジェクトストレージは2種類ありますが、Glacierはアーカイブ用と用途と機能がはっきりしているので使い分けに悩みません。またブロックストレージも永続化&使いまわししたければEBSで、インスタンスストアはローカルで高速なI/O処理に利用すると、これも使い分け方がはっきりしています。一番悩むのが、ファイルストレージだと思います。ファイルストレージには、EFSとFSx for WindowsとFSx for Lustreがあります。ここをどう使い分けたらよいのか難しいので、個人的な見解含みでザックリと分けたいと思います。

EFS

 まずEFSは、Linux向けのファイルシステムとして考えましょう。何故ならば、Windowsの素のドライバーでは、未だEFSをサポートしていないからです。EFSはNFSv4プロトコル経由でのアクセスを前提としていますが、Windowsは今のところNFSv4に対応していません。利用したい場合は、サードパーティ製のドライバを使うという手がありますが、それであれば次で紹介するFSx for Windowsを使ったほうが良いです。
 それ以外の特徴として、参照系のアクセスに強く書き込み性能は高くないという点があります。『何千もの Amazon EC2 インスタンスに対して大規模な並列共有アクセスを提供するように設計されている』と豪語されているのですが、一方でWrite Manyなシステムには向いていません。あと、EBSに比べるとRead・Writeとも性能はそこまで高くないです。更にスループットモードがバーストとがあり、バーストモードはサイズによって基本性能が変わります。使い所として悩みますが、CMSの共有ストレージとしてのコンテンツの置き場に使いやすいのも事実です。その際は、CloudFront等と併用してキャッシュを上手く使いましょう。

FSx for Windows

 EFSがWindowsに使えないとすると、じゃぁどうすんのという時に出てくるのがこのFSx for Windowsです。FSxは、FとSが大文字でxが小文字というこだわりのネーミングですが、そもそも何の略称か解りません。FSxにはfor Windowsとfor Lustreの2種類があり、アーキテクチャ・機能・用途も大きく違っています。for Windowsは名前の通りWindows用のサービスで、フルマネージドなWindowsのファイルサーバとして使えます。ということで、Windowsでファイルストレージが必要になった場合は、FSx for Windowsを使いましょう。

www.slideshare.net

FSx for Lustre

 最後のファイルストレージがFSx for Lustreです。Lustreは、フルマネージドな分散ファイルシステムで、S3とシームレスに統合できるファイルストレージです。個々の単語の意味を理解できても、つなげると解らなくなってしまいます。まずS3とのシームレスな統合というのは何かというと、ファイルシステム作成時にS3のバケットと関連付けできます。そして、S3上のファイルをインデックスし、あたかも自前のファイルのようにみせます。初回アクセス時はS3から取得するので遅いのですが、2回目以降はキャッシュしているので高速です。なんとなくStorage Gatewayのキャッシュ型ボリュームの挙動と似ていますね。主な用途は、高速なデータアクセスが必要なハイパフォーマンス・コンピューティングや機械学習とのことです。

www.slideshare.net

まとめ

 AWSのサービスはいろいろあって悩むと思います。悩んだ時は、一度基本に立ち返ってどのレイヤーに対応したサービスなのかを確認するといいのかもしれません。


See Also

blog.takuros.net

blog.takuros.net

夢の機能なのか?Amazon EBS マルチアタッチを使用した複数インスタンスからのEBS共有

 こんにちは。仕事でAWSの構築し、プライベートでAWSの研究と技術書の執筆をし、Amazonで本を売っているAmazon依存症の佐々木(@dkfj)です。

 今回の基本に立ち返ろうシリーズ(?)は、EBSです。EBSといっても、2020年2月に出てきたAmazon EBS マルチアタッチについです。この機能、ものすごくザクッというと、EBSを複数のインスタンスから共有する仕組みです。EC2とかEBSの設計をしていると誰しも一度は、EBSを複数のインスタンスで共有できないのかなぁと思ったことはあるんではないでしょうか?新機能として出たマルチアタッチの仕組みは、その救世主となるのでしょうか?簡単に解説してみます。

EBSのマルチアタッチ機能の概要

 まずEBSのマルチアタッチ機能はどういったものなのでしょうか?図で見たほうが早いので、それをもとに解説します。

f:id:dkfj:20200903175117p:plain
Amazon EBS マルチアタッチ

 EBSのマルチアタッチの動きとして、まずアベイラビリティー・ゾーン(AZ)をまたいでのアタッチはできません。そもそもEBS自体がAZまたぎでアタッチできないので、その仕様に引きずられるというのはある意味納得できます。同一のAZの場合のみ、複数のインスタンスにアタッチできます。これだけの制約であれば、まだ使えそうな気がしますね。ただ、それ以外の制約が結構ありますので、列挙してみます。

  • 同一のAZのみ(説明済み)
  • Nitro システムのインスタンスのみ利用可能
  • 最大 16 の Linux インスタンス(Windowsはアタッチできるが、インスタンス間で共有されているボリューム上のデータはOSから認識されない)
  • プロビジョンド IOPS SSD (io1) ボリュームのみ利用可能
  • 現状では、us-east-1、us-west-2、eu-west-1、および ap-northeast-2 リージョンのみ利用可能
  • I/O フェンスをサポートしていない
  • ブートボリュームとして作成できない
  • インスタンスあたり 1 つのブロックデバイスマッピングにアタッチできる
  • リュームの作成後に、マルチアタッチを有効または無効にできない
  • ボリュームのボリュームタイプ、サイズ、プロビジョンド IOPS を変更できない
  • Amazon EC2 コンソールまたは RunInstances API を使用してインスタンスの起動時に有効にすることはできない

参照元は、こちらです。
Amazon EBS マルチアタッチを使用した複数のインスタンスへのボリュームのアタッチ - Amazon Elastic Compute Cloud

 いろいろと無い無い尽くしですが、できたばかりのサービスなので致し方がないと思います。一方で、サラッと別のところでもっと大きな課題が提示されています。

EBS Multi-Attach では、標準ファイルシステムはサポートされていません。XFS、EXT3、EXT4、NTFS などのファイルシステムは、複数のサーバーまたは EC2 インスタンスが同時にアクセスするようには設計されていません。したがって、これらのファイルシステムには、書き込み、読み取り、ロック、キャッシュ、マウント、フェンシングなどの調整と制御を管理するための組み込みメカニズムがありません。

複数のサーバーが標準ファイルシステムに同時にアクセスできるようにすると、データの破損または損失が発生する可能性があります。EBS Multi-Attach ボリューム上の標準ファイルシステムを操作できるようにする設定は、サポートされていません。

aws.amazon.com

 OSが備えているファイル保護の仕組みは、マルチアタッチでは対応していないので、データの扱い方によってはファイルが壊れることがありますよということです。端的にいうと、排他制御ができないということです。じゃぁ、書き込み用のインスタンスを1台にして、後はリードオンリーのインスタンスにすれば良いのではという案も出てくると思いますが、リード側は書き込み完了を検知できないので難しそうです。じゃぁ何に使うのというところを、考察してみます。

EBSのマルチアタッチ機能のユースケース

 先述の制約を考えると、参照系のみの不変のデータを扱うのに良さそうだなと思いした。みなさん、AWSが提供するパブリックデータセットってご存知でしょうか?主に学術向けで、天文や科学、気象データなどをパブリックで公開して役立てようというプロジェクトです。

registry.opendata.aws

 今見てみると、データはS3で提供されているのですが、昔はEBSのスナップショットとして公開されていたような気がします。それを自分の環境でEBSとして実体化させて使うと。データ分析の分野であれば元となるデータセットがあって、それを元に複数のインスタンスで計算するというのがよくあると思います。その際、個々のインスタンスにEBSをアタッチすると高コストになりますが、マルチアタッチEBSであれば1つ分のコストで済みます。
 用途としてはかなり限定されますが、EBSのコスト高で困っているシステムというのは意外に多いです。そういった問題の解決に活用できないか検討するのも良さそうですね。

まとめ

 まとめとしては、EBSのマルチアタッチは夢はあるけど、現状では制約が大きい。特に大きな問題としては、ファイルの書き込みの排他制御ができないことです。ただ、参照系にしか使っていないEBSがあるのであれば、ワンチャンあるよという感じです。
 ちょっと発表を聞いた時に比べると夢がしぼんだような気がしますが、私達には夢のストレージであるS3があります。四の五の言わずに、S3を上手く活用する仕組みを考えましょう

booth.pm

booth.pm

Security-JAWSで、AWS認定セキュリティ専門知識の試験について話してきました

 こんにちは。仕事でAWSの構築し、プライベートでAWSの研究と技術書の執筆をし、Amazonで本を売っているAmazon依存症の佐々木(@dkfj)です。

 8月の登壇チャレンジの第三弾のSecurity-JAWSのレポートです。AWS認定セキュリティ専門知識の対策本の発売記念として、試験についての話をさせて頂きました。

s-jaws.doorkeeper.jp

発表内容

 20分枠で、前半(佐々木)と後半(上野さん)とで、別々に発表させて頂きました。

speakerdeck.com

speakerdeck.com

AWS認定セキュリティ専門知識の試験対策について

 試験の個別の問題についてはNDAで話すことができません。なので、どういった観点で学べば良いのかという話をさせて頂きました。受験した事が多いソリューションアーキテクトとの違いは、次の絵のとおりです。

f:id:dkfj:20200903190106p:plain
ソリューションアーキテクトとセキュリティ専門知識の違い

 ソリューションアーキテクトは、どのように作るのかを問われます。セキュリティ専門知識では、構築する/したシステムの安全をより確保するにはどうしたら良いのかという事を問われます。もちろん、ソリューションアーキテクトもWell-Architectedの柱の一つであるセキュリティについて問われることが多々あります。しかし、セキュリティ専門知識の方は、ずっとそのことについて問われるという形になります。

 具体的には、何を勉强したら良いのかという点については、公開されている試験の領域と配点を参考にするとよいです。

f:id:dkfj:20200903190421p:plain
セキュリティ専門知識の対象分野と配点割合

 20%以上の領域は4つありますが、私としては赤枠で囲っている3つの分野を重点的に勉强するのが良いと思います。なぜなら20%の配点がある『IDおよびアクセス管理』はIAMが重点的に問われて、かつIAMは他の分野にも密接に関わっています。IAMの技術同人誌を出しているからというバイアスはあるものの、AWSのセキュリティの根幹の一つはIAMです。ここをまず徹底的にやりましょう。
 あとの重点分野としては、KMSとS3やEBSなどのデータ保護です。KMSについては、普段から知らずに使っているという事が多いと思います。セキュリティ専門知識では、明示的にどういった場合にどのように使うのかということを理解しておく必要があります。なかなか奥深い分野なのですが、試験勉強を通して鍵管理についての知識を深めていくと、世の中のセキュリティ製品についての特徴がより解りやすくなります。セキュリティには、鍵の扱いは必須です。
 最後は、データの保護に関してS3やEBSの暗号化や経路の安全の確保の仕方です。S3はサービスとして(たぶん唯一)サーバーサイド暗号化とクライアントサイド暗号化に対応しているサービスです。何故、その両方に対応しているのか、問題となるユースケースを突き詰めていくと理解できるようになります。このあたりと、経路の暗号化のパターンを把握していると強いです。

感想

 我々の発表は試験という観点でしたが、他の登壇者の方々はThe専門家という感じで専門性が高い発表が続きとても勉强になりました。オンラインで参加できるようになっているので、気軽に参加してみてはいかがでしょうか?最後に、参加者から共感の高かった上野さんの名言「試験に不合格になっても、落ち込まない」に対して私からの補足をもってお終いとさせて頂きます。

いや、半端ないって

booth.pm


booth.pm

滋賀県(大津市)のデパートは何故潰れるのか?

 こんにちは。仕事でAWSの構築し、プライベートでAWSの研究と技術書の執筆をし、Amazonで本を売っているAmazon依存症の佐々木(@dkfj)です。

 先日、滋賀県大津市唯一のデパートである西武百貨店が閉店となりました。元滋賀県民としては、寂しさがあるのでちょっと語ってみます。ちなみに大津市に住んでいましたが、大津市と宇治市の境の山奥に住んでいたので、子供時代は西武がある辺りは大都会だと思っていました。

www.kyoto-np.co.jp

 西武百貨店は44年の歴史がありましたが、近隣の大型商業施設はことごとく短命で終わっています。

浜大津OPA(オーパ) 1998年オープン、2004年閉店
大津PARCO 1996年オープン、2016年閉店

時代の流れもありますが、滋賀県の特殊要因も多分にあるので、ちょっと解説してみます。

大津市の大型商業施設が厳しい理由

琵琶湖がある

 滋賀県の宿命ですが、琵琶湖があるというだけで商業地としては致命的なハンデを持っています。どういうことかというと、普通店舗は徒歩や車などの移動手段の違いはあれど、半径○○キロ圏内の人を前提として商圏を持ちます。琵琶湖があると何故問題なのか?商圏の半分が湖の底になってしまうからです。言葉で説明してもイメージわきにくいので、Google Mapsさんのスクショで説明させてもらいます。西武百貨店を中心に円を適当に書きましたが、半分は琵琶湖になりますよね。

f:id:dkfj:20200902021912p:plain

 琵琶湖には当然人は住んでいなくてブラックバスしかいないので、お客さんにはなりえません。もう少し下流にいった魚と遊べるパラダイスの南郷水産センターの鯉であればもう少しで地上に出てこれそうですが、それにしたってお金を持っていません。

www.youtube.com

 ということで、琵琶湖のせいで商圏が半分というハンデがあります。

琵琶湖じゃないところは山がある

 じゃぁ、もう少し琵琶湖から離れたところに立地すればいいじゃないかと思うかもしれません。でも、それも難しいのです。滋賀県と聞くと琵琶湖だけあるようなイメージですが、それは正確ではありません。琵琶湖じゃないところは山しかないのです。(ちょっと言い過ぎ)
先程の地図を航空写真で見てみましょう

f:id:dkfj:20200902022718p:plain

はい。琵琶湖と山に挟まれていますね。もう少し琵琶湖より離れられそうにも見えなくはないですが、JRより西側(写真左)の方は斜面を切り開いたところです。


 ちなみに西の山は、織田信長の比叡山延暦寺の焼き討ちで有名な比叡山を含む山脈です。お猿さんが多くて、たまに麓の方まで遊びに来てくれますが、やっぱりお金は持っていないですね。

京都駅に近い

 あともう一つ致命的な問題があります。それは、実は電車だと京都駅にめちゃくちゃ近いということです。他県の人から見たら、或いは京都市の人から見ても大津と京都は離れているように印象を持っていると思います。でも、JRに乗ると大津駅〜京都駅は10分でいけます。早いやつだと9分。ということで、がっつり買い物しようと思うと、みんな京都に行ってしまうのですよね。

 以上、3点が大津市の商業施設が持つハンデでした。まぁもともとそれ前提の店舗計画なので、モノが店舗で売れなくなったとかの時代の流れも大きいとは思います。ちなみにこの構造は明るい廃墟として名を馳せたピエリ守山と同じ構造ですね。あちらは、琵琶湖大橋のそばということで、渋滞の問題もあったりします

そして草津の時代になったが

 ついでに蛇足。滋賀県は最近では大津より少し北東の草津の方が近鉄百貨店を中心に発展しています。草津と聞くと温泉を思い浮かべると思いますが、まったく関係ない草津です。草津駅周辺は、もともと琵琶湖から離れた田園地帯でした。それがベットタウンとして発展し人口が増え、かつ琵琶湖の呪縛からも京都の重力からも離れているお陰で上手く離陸できた模様です。

f:id:dkfj:20200902024830p:plain

 一方で起爆剤の一つであった立命館大学のびわこ・くさつキャンパスが離れていくこともあり、どうなるのかなぁと心配なところではあります。

まとめ

琵琶湖あっての滋賀県ですが、琵琶湖のほとりの商売は大変です