AWSをいじり倒す(9.CroudTrail、Athena)

前回からの引き続きで、CroudTrailを使ってVPCエンドポイントを使ったS3へのアクセス証跡を確認してみる

参考にしたのはこれ

S3のVPC Endpoint経由でアクセス出来ているか否かの確認 – Publicサブネット編 – サーバーワークスエンジニアブログ

 

CroudTrailは有効化しないとログ残らないのかな、と思っていたが

特に設定の必要はなく常時ONになっているようだ。

画面を開いてみると早速今までいじくりまわしてきた形跡が見えた。

f:id:Messerarche:20200507074006p:plain

 

 

 

 

一部切り取って確認してみる。

f:id:Messerarche:20200507074853p:plain

眺めていて気付いたのは

バケットにオブジェクトをアップロードしたログ、というのは残ってない。

・EC2上でCLIによるBucket操作を行うと、ユーザ名はEC2のインスタンスIDになる。

(黒塗りのところはAWSコンソールから操作したので自分のユーザIDが表示されている)

という点。つまり、何でもかんでもCroudTrailに残るわけではないので、事前に目的のログが保存されるかどうかは確認しておかないといけないし、EC2に誰がアクセスしたかを別途把握する仕組みがないと追えなくなる。

 

具体的には、S3のオブジェクト操作ログは、

S3オブジェクトレベルのログ記録+監視方法 - Qiita

のようにオブジェクトレベルのログの記録を有効にする必要がある。

また、EC2のログはClowdWatch logsと連携させてログ記録+監視できる。

AWS構成パターン(CloudWatch Logs/EC2ログ管理)

 

このように調べたら何らかの対処法は出てくるけど、この辺は手探りで設定していくと検討漏れが出ること間違いなしなので、構築ノウハウを記載した書籍等を読んで所謂ベストプラクティスなやり方を身に付けた方が良さそうだ。

資格対策本ではこの辺はカバーできないなぁ。

 

 

さて改めて、

・S3にエンドポイント経由のアクセスができているかどうか

・ついでにオブジェクトレベルのログ記録ができるかどうか

の2点を確認することにする。

 

 

 S3にエンドポイント経由のアクセスができているかどうか

エンドポイントのない状態でバケット作成・削除→エンドポイント作成→バケット作成・削除のログ。

f:id:Messerarche:20200516222552p:plain



エンドポイント作成前のCroudTrailのイベント情報

f:id:Messerarche:20200516222840p:plain

ログ詳細を頑張って見なくても、発信元IPがパブリックIPになっているので、

これでもう十分インターネット経由ってわかりそう

エンドポイント作成後

f:id:Messerarche:20200516223426p:plain

発信元IPアドレスがローカルになっている。 

やはりこれだけでちゃんと機能しているとわかってしまった。

 

寂しいのでログ詳細も見てみると

エンドポイントなし

f:id:Messerarche:20200516224018p:plain

エンドポイントあり

f:id:Messerarche:20200516224036p:plain
 vpnEndpointIdってのが増えていることがわかる。

 

通信時間に大した差がないのは前記事の通りだが、

エンドポイント経由かどうかで料金が変わってくるので、

エンドポイント設定後は一度ぐらいこのログを見て安心した方が良いと思う。

 

オブジェクトレベルのログの記録

このオブジェクトレベルのログというのは

今まで見ていたイベント履歴にログが増えるわけではなく、

証跡情報として指定したS3バケットに保存される形式になるようだ。

 

まずはログ保存用のバケットをサクッと作る

f:id:Messerarche:20200517150721p:plain

 

そしてログ保存の設定。

CroudTrailの証跡の作成から

f:id:Messerarche:20200517150817p:plain

 

証跡情報の作成

f:id:Messerarche:20200517150958p:plain

証跡名は適当に。

別リージョンからアクセスすることはないので、

全てのリージョンに→いいえ

 

管理イベントはとりあえず全部記録したいので「すべて」「はい」

 

Insightsイベント

f:id:Messerarche:20200517151201p:plain

書き込み管理APIの異常な呼び出しボリュームとはいったい

CloudTrail Insights の発表: 異常な API アクティビティの特定とそれへの対応 | Amazon Web Services ブログ

スムーズに実行されている場合のログエントリは、さながら工場で安定して響く安心感のある機械音のようなものです。しかし不具合が発生した際には、その音が邪魔になりどの機器に不具合があるのかが聞き取りにくくなります。ログデータの量が膨大になる可能性があるような大規模なソフトウェアシステムでも、同じことが言えます。その記録を精査して実用的な情報を見つけるのは骨が折れる仕事です

ぐうわかる・・・

 

で、その中から異常なアクティビティを発見してくれる機能ってことらしい。

お値段安かったら有効にしてもいいと思うけど

CloudTrail Insights では、Insight タイプごとに分析された書き込み管理イベントについて、100,000 イベントごとに 0.35 USD の料金が請求されます。

100000イベント・・・が多いかどうかはシステムの規模にも依るのでなんとも。

 

データイベント

f:id:Messerarche:20200517152256p:plain

記録したいS3バケットを指定することができる。

てっきりS3の設定画面からログ記録の有効化するのかと思ったけど、

CroudTrail側から設定できるみたいだ。

 

S3バケットの追加からバケットを選択

f:id:Messerarche:20200517152444p:plain

 

ストレージの場所

f:id:Messerarche:20200517153420p:plain

ログの保存先S3。さっき作ったS3バケットを指定。

プレフィックスで指定した場所にたまっていく模様

ログファイルの検証とは、ログの改竄がないかどうかをチェックする仕組み。

 

できた。

f:id:Messerarche:20200517153850p:plain

 

 

S3の設定を見に行くと、オブジェクトレベルのログ記録が有効になっている

f:id:Messerarche:20200517154000p:plain

 

さっそくオブジェクト操作をしてみる

f:id:Messerarche:20200517154506p:plain

確認、削除、アップロードを行った。

 念の為、S3のGUIから手動でも適当なファイルをアップロードダウンロードを行っておく

 

〜10分後〜

ログの生成を確認。保存先の階層が結構深い

f:id:Messerarche:20200517160202p:plain

json形式が.gzで保存されているので、ローカルに落として解凍し

中身を見てみる

f:id:Messerarche:20200517161329p:plain

わかりにくっ!

これはこうやって読むものじゃないな

 

これによるとAthenaで読むのが良いみたい。

CloudTrailでS3オブジェクトレベルのログを取得してAthenaで閲覧してみた | Developers.IO

 

そもそもAthenaってなんだ

Amazon Athena とは - Amazon Athena

標準 SQL を使用して Amazon Simple Storage Service (Amazon S3) でのデータの直接分析を簡易化するインタラクティブなクエリサービスです。

めちゃめちゃ限定的ィ!

それだけS3のログはよく利用されるってことなのかな。

 

早速、CroudTrailのイベント履歴からAmazon Athenaで高度なクエリを実行

f:id:Messerarche:20200517161955p:plain

 

保存場所を選ぶ。この時のSQLのクエリは自動で作ってくれている。

ここで自動生成されるAthenaテーブル名は後で使う。

f:id:Messerarche:20200517162108p:plain

 

できたようなのでAthenaに移動

f:id:Messerarche:20200517162211p:plain

 

 

Athenaの画面。

f:id:Messerarche:20200517162346p:plain

 

まずはSettingsで、Athenaクエリ実行結果を保存するS3バケットを指定。

f:id:Messerarche:20200517162631p:plain

 

クエリを作成。

f:id:Messerarche:20200518114503p:plain

参考記事からコピペしたものをベースに、日付とテーブル名を変更。

テーブル名はさきほど表示されていたものを使用。

左のメニューにも表示されてるけどね。

 

ところでこのクエリの書き方って、どうやって学ぶんだろう・・・。

自動生成する方法は見当たらないので、いじくってたらだんだん覚えていく系かしら

 

 Save asでクエリを保存。

f:id:Messerarche:20200517163740p:plain

 

Run queryで実行してみると・・・

f:id:Messerarche:20200518114751p:plain


あれ?GUIから出し入れしたログのみが出てきて、

EC2からCLIで操作したログがでてこない・・・。

 

仕方ないのでログファイルを直接頑張って読んでみることにする

f:id:Messerarche:20200518120017p:plain

eventNameがDeleteObject・・・これはrmしたときのログだろう。

 

一方でcpしたときは

f:id:Messerarche:20200518124039p:plain

UploadPartに
 

f:id:Messerarche:20200518125650p:plain

CreateMultipartUploadに

 

f:id:Messerarche:20200518125742p:plain

CompleteMultipartUpload

という3種類が出てきている。
 

みるべきキーワードが分かってきたので、クエリを変更してみる。

f:id:Messerarche:20200518130830p:plain


GetObject,DeleteObjectに加えて上記の3種イベントを追加。

また、ログに

f:id:Messerarche:20200518130512p:plain

と書いてあったので、

and useridentity.type = 'IAMUser';

の条件では引っ掛からなくなると思い、削除した。

 

このクエリの実行結果はこちら。

f:id:Messerarche:20200518131411p:plain


で、このUploadpartとは、

つまるところ適当に30MBのファイルをアップロードしてしまったせいで

図らずしもこのマルチパートアップロードを行ってしまったらしい

Amazon S3 マルチパートアップロード CLI

大きなファイルをアップロードするときに分割する機能。

cpコマンドを使うと自動でマルチパートになるんだと。

 

 これは1パートあたり5MB以上、最大10000パートまでという仕様。

Amazon S3 マルチパートアップロードの制限 - Amazon Simple Storage Service

 

今回30Mのアップロードは4分割されてるっぽいので、8M前後に勝手に分けられたと推測。ログをよく読むとそれも書いてあった。

これが1つと

f:id:Messerarche:20200518132257p:plain

これが3つ。

f:id:Messerarche:20200518132236p:plain

いい具合に分割して送ってくれてたのね。

 

順番としては

CreateMultipartUpload→Uploadpart*4→CompleteMultipartUpload

なんだろうけど、順番通りログがでてないのは謎。

ログはコンマ0秒以下は残ってないので、仕方ないのかなぁ。

 

で、小さいファイルならCLIでもPutObjectになるんだよね?

ってことで1KBのファイルを作ってcpしてみる

f:id:Messerarche:20200518140242p:plain

 

結果。

f:id:Messerarche:20200518140159p:plain

無事PutObjectになった。

 

S3に複数人でファイルやりとりするとなったら、

やっぱ出し入れの情報は見たいし、オブジェクトレベルでのログ確認は必須だろうなぁ

 

 

ということでS3の操作から始まって、AWS CLIVPCエンドポイント、CroudTrail、Amazon Athena、マルチパートアップロードと色々話が広がって勉強になった。

 

進捗

f:id:Messerarche:20200518142525p:plain

 

 

AWSをいじり倒す(8.AWS CLI)

以下を参考にCLIでs3を操作する。

AWS CLIを使ってEC2のファイルをS3へアップロードしよう | Avintonジャパン株式会社

ゆくゆくはCLIマスターして、JSONでポリシーかけるマンになりたいなぁ。

 

環境としては、自PCから専用のIAMユーザとしてアクセスする方法と

EC2に操作したい対象のサービスのIAMロールをアタッチしてアクセスする方法がある。

 

VPC作って、VPC内で通信を完結させることも多いので

基本的には後者のほうがよさそう。

 

S3を操作したいので、今回はS3FullAccessをアタッチする。

EFSの時に作ったEC2にアタッチ済みのロールに追加(手抜き)

f:id:Messerarche:20200506150932p:plain

 

 

AWS CLIツールはEC2(Amazon Linux)なら最初から入っているのでインストールは

不要。

f:id:Messerarche:20200507082631p:plain

 

EC2を立ち上げ、アクセスしconfig変更。

f:id:Messerarche:20200506152646p:plain

今回アクセスキーは使わないのでNone
EC2のリージョン名はいろんな確認方法があると思うが

DNSとかにも埋め込まれているのでそれ見て抽出

f:id:Messerarche:20200506152807p:plain

出力はjsonがおすすめらしい

 

configの格納場所も確認

f:id:Messerarche:20200506153026p:plain

 

VPCの確認コマンドを打つとエラー

f:id:Messerarche:20200506153242p:plain

権限を付与していないので、当然。

UnauthorizedOperationって出た時はIAMロールを見直す必要がある。

 

当該EC2にアタッチ中のロールに追加で2ポリシーをアタッチ

f:id:Messerarche:20200506153516p:plain

VPCReadOnlyAccessがあれば上記コマンドは通るはず。

 

早速試すと・・・通った。再アタッチとかは必要なくて即時反映

f:id:Messerarche:20200506153629p:plain

 

EC2ReadOnlyAccess権限も付与したので、インスタンス情報も取得可能

f:id:Messerarche:20200506153935p:plain

 

aws helpコマンドでヘルプが読めるけど

awsの後に続くコマンドはめちゃめちゃ種類が多いので

やりたいことがある都度ネットで調べた方が早そう。

 

 

早速、前回作ったS3バケットにファイルを入れてみる。

f:id:Messerarche:20200506155824p:plain

test-s3-12345は前回つくったバケットの名前

特に問題なく移動できた

 

 

バケットそのものを作る

f:id:Messerarche:20200506161429p:plain

f:id:Messerarche:20200506161400p:plain

 

バケットを削除する

f:id:Messerarche:20200506161503p:plain

思いの外簡単で、詰まるところがない。

--forceオプションで中身があっても強制削除できる。

 

 

次に、VPCエンドポイントの効力を確認してみる。

すでにVPC作る時にS3へのエンドポイントを作ってしまっていたので、

まずはエンドポイントありの時間を計測

 

30MBの空ファイルを作成

f:id:Messerarche:20200506162524p:plain

 

timeで計測

f:id:Messerarche:20200506162610p:plain

 

VPCのS3向けエンドポイントを削除する

f:id:Messerarche:20200506162739p:plain

削除すると、ルートテーブルからも消えた。賢い。

 

一旦消して、再度送信すると・・・

f:id:Messerarche:20200506163321p:plain変わ・・・らない!?

 

EC2はオハイオ、S3もオハイオの状況だとAWS内部を通すも外部を通すも

転送速度としてはそんなに変わらないのかもしれない・・・。

 

探していると、同じく確認しようとしている記事を見つけた。

S3のVPC Endpoint経由でアクセス出来ているか否かの確認 – Publicサブネット編 – サーバーワークスエンジニアブログ

なるほど、CroudTrailか。次回CroudTrailを触ってみることにする。

 

進捗

f:id:Messerarche:20200507073759p:plain

 

AWSをいじり倒す(7.S3)

S3を使ってみる。

f:id:Messerarche:20200505220047p:plain

バケットを作成ボタンを押す。

 

 

設定

f:id:Messerarche:20200505223659p:plain


バケット名は適当に、一意に。全S3ユーザで一意なので、生半可な名前は被るw

リージョンは改めてここで選択。

testにつかっているEC2サーバと同じリージョンにする

 

パブリックアクセスの設定

f:id:Messerarche:20200505220455p:plain

 

基本的にはブロック推奨らしい。

f:id:Messerarche:20200505222234p:plain

日本語変だなぁ・・・

いったんブロックで作って、余力があったらパブリックも試すことにする。

S3で誤ったデータの公開を防ぐパブリックアクセス設定機能が追加されました | Developers.IO

S3のアクセス制御はなかなか奥が深そう

 

オブジェクトのロック

f:id:Messerarche:20200505223513p:plain

今回は無効。

これで作成。設定項目少ないな〜

 

できたっぽい。

f:id:Messerarche:20200505224046p:plain

 

フォルダの作成

f:id:Messerarche:20200505224348p:plain

 

フォルダ名を入れて作成

f:id:Messerarche:20200505224451p:plain

暗号化についてこの辺が参考になる

S3 オブジェクトに暗号化を追加する方法 - Amazon Simple Storage Service

 

 

できた。

f:id:Messerarche:20200505224532p:plain

 

アップロードしてみる

f:id:Messerarche:20200505224614p:plain

う〜ん直感的。書くことがないぐらい。

適当に画像をD&Dで追加

 

アクセス設定

f:id:Messerarche:20200505235250p:plain

このユーザーIDって誰やねんと思ったら、自分のことらしい。

 

プロパティの設定。

f:id:Messerarche:20200505225904p:plain

勘違いしていたけど、バケットに対してストレージが割り当てられるんじゃなくて

オブジェクトに対してストレージの種類を割り当てる感じなのね。

 

暗号化とメタデータ

f:id:Messerarche:20200505231055p:plain

メタデータのヘッダーについて

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/user-guide/add-object-metadata.html

f:id:Messerarche:20200505232850p:plain

上図のようにアップロードしようとしているファイルのヘッダーを変更したり、AWSオリジナルヘッダーを追加したりできる。

 

タグはNameを指定してみたが・・・S3ではそういう使い方ではないみたい。

f:id:Messerarche:20200505233038p:plain

他のサービスで使うようなタグというよりは、ポリシーの対象グループとするなど、もう少し高級な使われ方をするようだ

S3 オブジェクトのタグ付け機能を使ってみた – サーバーワークスエンジニアブログ

 

 

 

アップロードボタンを押してアップロード

f:id:Messerarche:20200505233212p:plain

できた。

 

ただ、あんまりGUI上で操作しているような記事を見かけず

CLIでの操作が主流。

 

次回、AWS CLIを使って、CLIでの操作にトライする

AWSをいじり倒す(6.EFS)

 

EFSを使ってみる。

以前、複数のWindowsサーバをEC2で立ち上げて、

ファイル共有したいなぁと思って調べた時に出てきたキーワードだけど

EFSはWIndows対応してなくて使えなかった。

blackbeltみてても結構大きくWIndows非対応と書いてあるので、今後も対応することはないのだろう・・・。

(ちなみにその時は多めにEBSを積んだEC2をストレージ用として建て、別EC2からネットワークドライブとしてマウントした。)

 

調べてみると、気合でWindowsから使う方法もあるにはあるみたいだが、

今回はLinuxサーバを2つたてて、それぞれにEFSをマウントし、ファイル共有を試す

AWS EFS をEC2にマウントしてみる - Qiita

これが参考になりそう

 

サービスからEFSを選択した最初の画面

f:id:Messerarche:20200504204249p:plain

 

ネットワーク設定

f:id:Messerarche:20200504204337p:plain

アクセスしたいEC2の所属するVPCを指定する。

 

マウントターゲットの設定

f:id:Messerarche:20200504204529p:plain

セキュリティグループはデフォルトで何か入っているが、今までの経験からするとうまく機能しないと思われるので、要確認。

 

タグの設定

f:id:Messerarche:20200504204741p:plain

なんでか説明が詳しくて、Nameがデフォルトで入っている

 

ライフサイクル管理

f:id:Messerarche:20200504204845p:plain

EFSにはスタンダードと定頻度アクセスという2種類のストレージがある

EFS ストレージクラス - Amazon Elastic File System

ただ、定頻度を最初から指定できるわけではなく、このライフサイクル管理によって指定した期間アクセスがないと自動で移動されるような使い方になる

 

選択肢はこんな感じ。

f:id:Messerarche:20200504205425p:plain

長期保存となるものはなるべくS3に保存すべきなんだろうけど、

使うと思ってたけど実は使わない、みたいなものがあるとしたら

有効にしといて損はない機能かな。

 

スループットモードの選択

f:id:Messerarche:20200504210324p:plain

バーストは、普段貯金しておいて突発的な支出に備えるモードであるが

貯金で買えない量のトラフィックが必要ならプロビジョニングモード。

この辺はblackbeltP66あたり参照

 

パフォーマンスモード

f:id:Messerarche:20200504211544p:plain

最大I/Oを使うべきかどうかはClowdWatchあたりで監視してないとわからん気がする

 

暗号化

f:id:Messerarche:20200504211917p:plain

暗号化を有効にすると、保管されているデータの暗号化はともかく

転送中のデータ暗号化は証明書の準備など、設定がややこしくなる。

インターネット越しにEFSと通信する時とかに必要になってきそう。

同一VPC内のEC2との通信であれば不要かな。

Amazon Elastic File System(EFS)を使ううえでの勘所 - Qiita

 

 

f:id:Messerarche:20200504212957p:plain

デフォルトでいろんな制限しておいて、IDベースで権限を上書きして使う。

 これはこの辺が参考になった

[アップデート] Amazon EFSでIAM認証とアクセスポイントの設定が可能に | Developers.IO

試しに、読み取り専用アクセスを強制にチェック。

ポリシーの設定を押して

f:id:Messerarche:20200504235722p:plain

JSONの画面を出して、保存する。ここまでしないと反映されない。

 

 

 

アクセスポイント

f:id:Messerarche:20200504215159p:plain

アクセス権限付きのディレクトリ を作成するイメージ。

先ほどと同じ

[アップデート] Amazon EFSでIAM認証とアクセスポイントの設定が可能に | Developers.IO

が参考になる。見様見真似で2個ディレクトリ を作成

f:id:Messerarche:20200504220027p:plain

 

 

確認画面を経て、作成。

f:id:Messerarche:20200504220400p:plain

割とすぐできた

上の画像に見えているファイルシステムIDを使ってマウントすることになる。

 

セキュリティグループの確認

入ってるのはデフォルトのガバガバ設定だった。

f:id:Messerarche:20200504225759p:plain

なんか作る時は先にセキュリティグループを作らんとあかんかも。

NFSは2049のTCP

f:id:Messerarche:20200504230222p:plain

ルールを作って

 

ファイルシステムアクセスの管理から

f:id:Messerarche:20200504230406p:plain

 

新たにセキュリティグループを選択して保存

f:id:Messerarche:20200504230459p:plain

 

 

 

接続確認をしていく。

接続したいEC2に、Linux NFSv4 Clientのインストールが必要。

EFSマウントヘルパーというのがamazon-efs-utilsに含まれており、これを使うことが推奨されている

sudo yum –y install amazon-efs-utils

特に問題なくインストールできた。

 

さてマウント。

f:id:Messerarche:20200504225322p:plain

怒られた。

 

どうもこの指定したファイルシステムIDからドメイン名を生成して、

ドメイン名からマウント対象のEFSを探してくる挙動みたいなのだが

DNSの解決ができねーぞ、と。

【AWS】EC2からEFSをマウントする - MOテクノロジー

 

久々にVPCの画面を開いてDNS設定を確認

f:id:Messerarche:20200504230919p:plain

 

DNS解決の編集・・・すでに有効

f:id:Messerarche:20200504231003p:plain

 

DNSホスト名の編集

f:id:Messerarche:20200504231035p:plain

チェックついていなかったので、有効化

・・・で、DNSホスト名の編集って何?

VPC での DNS の使用 - Amazon Virtual Private Cloud

パブリック IP アドレスを持つインスタンスが、対応するパブリック DNS ホスト名を取得するかどうか示します。

この属性が true の場合、VPC 内のインスタンスDNS ホスト名を取得しますが、これは enableDnsSupport 属性も true に設定されている場合のみです。

今回のEFSはパブリックIPなんて持ってないはずなんだけど・・・。

パブリックDNSって関係なくない?

 

これで結果が変わる理由がよくわからないままコマンドが・・・通った。

f:id:Messerarche:20200505000644p:plain



念の為nslookup

f:id:Messerarche:20200504232642p:plain

ローカルIPだよなぁ。モヤモヤ

 

気を取り直して、アクセス制限を確認する。

f:id:Messerarche:20200505000847p:plain

想定通り。

 

EC2用のロールを作成

f:id:Messerarche:20200505001322p:plain

 

ロールの作成

f:id:Messerarche:20200505001439p:plain

EC2を選ぶ

 

今回必要なのはElasticFileSystemでClientでRead/Writeなので

f:id:Messerarche:20200505001716p:plain

これを選択。

タグに適当に名前をつけて、作成。

 

できた。

f:id:Messerarche:20200505002031p:plain



 

EC2の画面を出して、ロールのアタッチ

f:id:Messerarche:20200505002155p:plain



先ほど作ったロールを選択。

f:id:Messerarche:20200505002231p:plain

 

さて、これで本当にいけるんだろうか。

いったんEFSをアンマウントして、iamを指定してマウントする

f:id:Messerarche:20200505002631p:plain

f:id:Messerarche:20200505002544p:plain

 

ファイルを作ってみると・・・

f:id:Messerarche:20200505002749p:plain


いけた!

アクセスポイントも試してみる。

f:id:Messerarche:20200505003728p:plain

read-onlyのアクセスポイントにマウントしたら、書き込みが不可となった。

 

違うEC2を建てて、マウントしてみると今まで作ったファイルが見えた。

f:id:Messerarche:20200505005434p:plain

 

 

試し忘れたけど、EC2再起動するとマウント状態も解除されてしまうので

永続的にマウントするには追加設定が必要

Amazon EFS ファイルシステムを自動的にマウントする - Amazon Elastic File System

 

Linux系をメインで使うときの共有ストレージとしては、気軽にアタッチできて使いやすいかも。

でもSMB対応のストレージも欲しいなぁ

 

進捗

f:id:Messerarche:20200505005916p:plain

 

AWSをいじり倒す(5-2.RDS-Aurora)

Auroraを選んでみる。

 

f:id:Messerarche:20200503125418p:plain

簡単作成を選びたい気持ちを抑えて、勉強のために標準作成

 

Auroraを選ぶ

f:id:Messerarche:20200503123704p:plain

 

互換性はMySQLを選ぶ

f:id:Messerarche:20200503123754p:plain

互換性とはなんぞや?

よくある質問 - Amazon Aurora | AWS

 MySQL データベースで使用しているほとんどのコード、アプリケーション、ドライバー、ツールをほとんど、またはまったく変更を加えなくても Aurora で使用できることを意味します

なるほど。ということはテスト接続はMySQLと同じコマンドで試そう。

 

 機能を4つから選ぶ

f:id:Messerarche:20200503125347p:plain

サーバーレス気になる

Aurora Serverless の仕組み - Amazon Aurora

ワークロードの集中が数分または数時間しか続かない場合やアクティビティが低下したり完全になくなったりする期間が長く続く場合

が用途として適しているらしい。今回アクティビティなんて無いに等しいので

サーバレスのほうがいいのかも。

しかし、サーバレスって言うけど必要に応じたリソース分のサーバは結局あるわけだし、この単語どうにかならんかな。

文句言いながらサーバレスを選んでみることにした

 

設定

f:id:Messerarche:20200503131238p:plain

f:id:Messerarche:20200503131329p:plain

パスワード自動生成はしないぞ。

 

キャパシティー設定

f:id:Messerarche:20200503131427p:plain

この辺がサーバレス特有の設定

キャパシティユニットは2の累乗刻みで1〜256まで選べる。

今回は1〜2の最小構成でいく。

強制的にスケーリング・・・のところはタイムアウトって何だ

[アップデート] Aurora Serverless の最小キャパシティが 1 から指定可能になりました!&キャパシティ変更の強制オプションが追加されました | Developers.IO

ただし、以下のような場合には、スケーリングポイントが特定できず、タイムアウトになることがあります。

  • 進行中の長期のクエリやトランザクションがある場合
  • 一時テーブルやテーブルロックを使用している場合

なるほど。

アイドルの一時停止も便利そうだけど、今回はどちらのオプションもなしで。

 

接続

f:id:Messerarche:20200503132910p:plain

この辺は前回と一緒。

 

APIの項目が増えている

f:id:Messerarche:20200503133013p:plain

Aurora Serverless の Data API の使用 - Amazon Aurora

この API を使用すると、ウェブサービスベースのアプリケーション(AWS Lambda、AWS AppSync、AWS Cloud9 など)を通じて Aurora Serverless にアクセスできます

無料なら有効にしない手はない。普通にEC2を介せばコマンド発行できるんだろうけど、徹底的にコスト削りたい時には良いかも 

 

追加設定

f:id:Messerarche:20200503133853p:plain

 前回と一緒

ちなみにAuroraは暗号化がデフォルトで有効である(画像は割愛)

 

 

以上で設定おわり。データベースの作成ボタンを押す。

2回目なので標準作成でもサクサク選べた感はある。

 

作成中の様子

f:id:Messerarche:20200503134118p:plain

 

せっかくなので認証情報のところを押してみる

f:id:Messerarche:20200503134201p:plain

ここに自動生成のパスワードも出るわけね。

 

できたので接続してみよう

f:id:Messerarche:20200503134751p:plain


まずは前回と同じく建てたEC2サーバに接続.

f:id:Messerarche:20200503135538p:plain



mysqlデータベースに接続するコマンド、これも前回と同じもので

アクセス先を今回のAuroraにしたものを投入すると

f:id:Messerarche:20200503135655p:plain

普通につながった。 

 Aurora要素は微塵も感じられない

 

f:id:Messerarche:20200503140103p:plain

f:id:Messerarche:20200503140143p:plain

うーん操作感はMySQLと同じ。

 

あとはレプリカを作ってみようと思ったが、作成するメニューがない。

Aurora Serverlessが一般利用可能になったので試してみた | Developers.IO

Aurora Serverlessでは以下の機能をサポートしていません。

使えなかった・・・!

レプリカ作って負荷分散する思想と、負荷に応じて性能を拡張する思想は相容れないのかもしれないが、読む専用のリードレプリカの存在があった方が安心する(精神論)

というか、下記のダウンタイムが許容できない場合はサーバレスは使えんということになる。

AuroraかRDSどちらを選ぶべきか比較する話をDevelopers.IO 2019 in OSAKAでしました #cmdevio | Developers.IO

シングルインスタンス構成で、そのインスタンスがクラッシュした際のことを考えます。この場合、Auroraはインスタンスの自動復旧を行ないます。この復旧は通常10分未満で完了します。この10分のダウンタイムを許容できるのであれば、Mulit-AZにせずとも良いのではないでしょうか

 

 

しょうがないのでこのDBは消して新たに作成する。

今度はこちらを選ぶ。

f:id:Messerarche:20200503142454p:plain

 

すると新たなメニューが登場

f:id:Messerarche:20200503142539p:plain

これを選べばレプリカも最初から作成されるのかな?

早速作ってみると

f:id:Messerarche:20200503142917p:plain



2つ作成された・・・と思いきや、ロールが読み込みと書き込みで別。

f:id:Messerarche:20200503143116p:plain

エンドポイントは2つなので、これはいわゆるリードレプリカは1つで

書き込み権限のあるエンドポイントがマスターということか。

 

リーダーの追加でレプリカを増やしてみる

DB クラスターに Aurora レプリカを追加する - Amazon Aurora

f:id:Messerarche:20200503143223p:plain

 

設定画面

f:id:Messerarche:20200503143329p:plain

上では2cを選んでいるけど、

2cにサブネット作ってなくて怒られたので、のちに2bに変更

 

 

暗号化は触るところなし(画像は割愛)

 

設定

f:id:Messerarche:20200503143632p:plain

ソースには別のレプリカも選べる。

 

フェイルオーバー

f:id:Messerarche:20200503143806p:plain

本体が死んだとき、だれがプライマリになるかの優先度決め

プライオリティ"範囲"って、なんで範囲?

普通にプライオリティ値でいいのでは・・・。

 

この辺は特にいじる必要なし

f:id:Messerarche:20200503144108p:plain

 

パフォーマンスインサイト

f:id:Messerarche:20200503144326p:plain

Performance Insights を使用した Amazon RDS データベースの負荷分析 | Amazon Web Services ブログ

データベースの負荷(どのSQL文が負荷を発生させており、それはなぜなのか)を可視化するダッシュボードを使用して、エキスパートな方とエキスパートではない方の両方が、Performance Insights でパフォーマンス問題を容易に検出できます。

これは調子悪い時に有効にすれば原因がわかるかも。

 

メンテナンスも特に変更なし 

f:id:Messerarche:20200503144434p:plain

 

Add readerして、ロール:読み込みのレプリカが増えた。

f:id:Messerarche:20200503144746p:plain

 

 

結論としては、AuroraもMySQLも、使用感は同じ。コマンドレベルで同じ。

 

なので構成や挙動、お値段の違いを勉強して

最適な環境を選べるようにしましょう、という感じ。

何度か引用したこの記事によると

AuroraかRDSどちらを選ぶべきか比較する話をDevelopers.IO 2019 in OSAKAでしました #cmdevio | Developers.IO

ちょっと屁理屈に聞こえるかもしれませんが…たしかにAuroraの方がAWS利用費は高くなるかもしれませんが、その分人的コストを抑えれますよ?という話です。

結局こう書いてあるので、ちょい使いならMySQL、がっつりだとAuroraかなぁ(個人の感想です)

 

進捗

f:id:Messerarche:20200503150917p:plain

 

 

次はストレージ付近触ってみようかな

 

AWSをいじり倒す(5.RDS-MySQL)

RDSを作ってみる。今回はMySQLで作る。

 

RDSの画面からスタート。

f:id:Messerarche:20200429160108p:plain

 

データベースの作成

f:id:Messerarche:20200429160229p:plain

 

次の画面

f:id:Messerarche:20200429160303p:plain

簡単作成なるものができたらしい。

使うだけならこっちでいいのかも。

今回は標準作成でいく。

 

Auroraの猛プッシュをよくみるので使ってみたいけど、今回はMySQL

f:id:Messerarche:20200429160757p:plain

 

テンプレート を選ぶ

f:id:Messerarche:20200429160847p:plain

MySQL - AWSのRDSデータベース作成時の設定について|teratail

単に無料枠は時間やサイズに制限があるだけみたい。今回は無料枠でOK

 

設定

f:id:Messerarche:20200429161428p:plain

インスタンス識別子はtest-database-1に。

ユーザ名は、今回はadminでいいか。

パスワードはせっかくだから自動生成してもらおうかな。

でも、どこでパスワード確認するんだろうか(要確認その1)

 

DBインスタンスサイズ

f:id:Messerarche:20200429161725p:plain

無料枠だと、ここがまったく選びしろなく固定となるようだ。

(試しに本番用を選ぶと選択肢が増えた)

 

ストレージ

f:id:Messerarche:20200429161902p:plain

割り当てはSSD/20GBでいいとして

自動スケーリングはこれ日本語変だな??

「指定したしきい値を超えた場合にストレージを増やす」と書いてあるのに

「最大ストレージしきい値」を書けって。しきい値って言葉の使い方おかしくない?

【DBのディスクサイズ管理が簡単に】RDSのストレージがストレージの自動スケーリングをサポートしました! | Developers.IO

これによると、例えば上の画像の設定だとMAX1000GiBまで増やすという意味でOKらしい。

拡張のタイミング=いわゆるしきい値は勝手に考えてくれるんだろう。

 

可用性と耐久性

f:id:Messerarche:20200429163033p:plain

無料枠では選べないらしい。本番環境だと必須だろうなぁ

 

接続

f:id:Messerarche:20200429163254p:plain

 

VPCを指定する。

いろんなサービスでVPC指定しろと出てくるところを見ると、

AWSで何かしようと思ったらまずはVPCを作るところから取り掛かるのがよさそう。

 

追加の接続設定

f:id:Messerarche:20200429163657p:plain

サブネットグループ・・・RDSが使えるサブネットを指定するところ。既存のグループを選ぶとかはできない。新しいDBサブネットグループの作成、ということは新たなサブネットが生成されるのか?(要確認その2)

パブリックアクセス可能・・・同一VPC内にEC2を作るつもりなので、なし

VPCセキュリティグループ・・・説明を読む限りRDS用に作った方がよさげだが、ここでは名前しか付けられない。設定は自動なのか?(要確認その3)

データベースポートはこのまま。

以下のような感じに設定

f:id:Messerarche:20200429164401p:plain

 

認証

f:id:Messerarche:20200429164754p:plain

選びしろなし

 

追加設定

f:id:Messerarche:20200429164901p:plain

最初のデータベース名。

ここで名前入れておけばデフォルトでDBを用意してくれるようだ

適当にtest-mydbとしようと思ったら、ここは英字、数字と _ 以外

だめらしい。test_mydbにする。

 

バックアップ

f:id:Messerarche:20200429165429p:plain

保持期間は7日もいらないので1日にしておく

 

モニタリング

f:id:Messerarche:20200429165749p:plain

せっかくだからモニタリングは有効に。有料だけど。

 

ログのエクスポート

f:id:Messerarche:20200429165811p:plain

どんなタイミングで何のログがでるのかわからないので、全チェック

 

メンテナンス

f:id:Messerarche:20200429165904p:plain

メンテナンス中のダウンタイムについては以下。

必要とされる Amazon RDS メンテナンス中のダウンタイムを最小限に抑える

何をメンテナンスするか+マルチAZかどうかによってダウンタイムの影響が変わるが

完全0にはならないぽい。

使えない時間が存在する前提で運用しないとだめということか。

 

 

削除保護

f:id:Messerarche:20200429170601p:plain

今回は消えてもヨシ!

 

これでやっとこさ設定が完了。こりゃ長いわ・・・。

簡単作成ボタンができたのも頷ける。

データベース作成ボタンを押して完了。

 

作成中・・・。

f:id:Messerarche:20200429170856p:plain

 

識別子のところクリックするとステータスが情報欄でわかる。作成中

f:id:Messerarche:20200429170949p:plain

 

バックアップ中・・・

f:id:Messerarche:20200429171639p:plain

数分と書いてあるけど、結構時間かかるなあ。

 

利用可能。

f:id:Messerarche:20200429175542p:plain

 

 

さて、要確認事項をみていく

(要確認その1)自動生成されたパスワードはどこに?

ステップ 1: RDS DB インスタンスの作成 - Amazon Relational Database Service

[Auto generate a password (パスワードの自動生成)] – このオプションは無効にします。

公式ガイドが自動生成使ってなくて草

 

 そうこうしているうちに、パスワードのありかの記載を見つけた

DB クラスターを作成して Aurora MySQL DB クラスターのデータベースに接続する - Amazon Aurora

f:id:Messerarche:20200429181422p:plain

確かに作成中に青い帯出てた!でももう消えてるがな!!!オワタ

落ち着いて、ここの変更ボタンから

f:id:Messerarche:20200429181649p:plain

パスワードの再設定を行う。

f:id:Messerarche:20200429181751p:plain

変更をすぐやってしまうかどうか

f:id:Messerarche:20200429181843p:plain

もちろんすぐ変更。

自動生成、なんもいいことないじゃん・・・。

 

 

(要確認その2)サブネットはどう切られたのか

f:id:Messerarche:20200429182039p:plain

なんだか知らない子が2人いますね。

クリックしてみると

f:id:Messerarche:20200429182205p:plain

f:id:Messerarche:20200429182307p:plain

いや知ってる子やん。自分で作ったサブネットが列挙されているだけっぽい。

「新しい」DBサブネットグループの作成とは一体・・・。

 

(要確認その3)セキュリティグループ

f:id:Messerarche:20200429175805p:plain

 

なんじゃこりゃ案件。

パブリックアクセスは無しにしたのに、自宅のグローバルIPソースでのアクセス許可設定が入っている上に、VPC内からのアクセス許可はなし。全然違う。

 

以下のように書き換えた。

f:id:Messerarche:20200429175933p:plain

なんでこんな初期設定になってたのか謎。

自動で作ってくれる系はありがたいこともあるけど、チェックはしないといけないなぁ 

 

 

次に、リードレプリカを作成する。本体からコピーされた読み取り専用のRDS。

f:id:Messerarche:20200429182804p:plain

 

設定画面。

f:id:Messerarche:20200429182921p:plain

この辺はそのままでよさげ。

マルチAZ配置のところ、リードレプリカのさらにスタンバイの作成もできるのね

 

ネットワーク&セキュリティ

f:id:Messerarche:20200429183119p:plain

AZに本体とは別のAZ(2b)を指定。他はこのままでよさそう

 

暗号化はなし

f:id:Messerarche:20200429183217p:plain

 

 

設定

f:id:Messerarche:20200429183421p:plain

DBインスタンス識別子に適当な名前を入力。

なんか赤線入ったんですけど、また僕何かやっちゃいました?

何いれてもこの赤線が消えないので無視

 

ポートはそのまま

f:id:Messerarche:20200429183508p:plain

 

モニタリング

f:id:Messerarche:20200429183535p:plain

 

はリードレプリカまではしなくていいか。

 


ログは全チェック

f:id:Messerarche:20200429183613p:plain

 

 

メンテナンス

f:id:Messerarche:20200429183639p:plain

自動アップグレードの通知を受け取るかどうか。後からオフにもできる

 

以上で設定完了、作成ボタンを押す。

 

できてるできてる。

f:id:Messerarche:20200429184613p:plain



さて、接続確認を行っていく

RDSに接続するためのEC2を立ち上げて、SSHで接続する

f:id:Messerarche:20200429191300p:plain

 

そこから、RDSに繋いでみる。

接続先はRDSの画面から確認できるエンドポイント

f:id:Messerarche:20200429191435p:plain

 

まずEC2にmySQLクライアントをインストール

sudo yum -y install mysql

 

次に、データベースに接続

mysql -h test-database-1.ccoqjumqewod.us-east-2.rds.amazonaws.com -u admin -p

パスワードを入力すると・・・

f:id:Messerarche:20200429191850p:plain

お、つながった。

データベース一覧を表示するコマンドを投入

show databases;

f:id:Messerarche:20200429192027p:plain

おー、test_mydbもちゃんとできてる。

 

f:id:Messerarche:20200429192149p:plain

 中身は空っぽなんですけどね。

 

リードレプリカにも繋いでみる。

エンドポイントを確認して

f:id:Messerarche:20200429192728p:plain

 

接続コマンド投下

f:id:Messerarche:20200429192707p:plain

 

読み取り専用である事の確認

f:id:Messerarche:20200429193004p:plain

 

試しにテーブルを作ろうとすると怒られた。

確かにリードレプリカだ。

 

メインの方でテーブルを作ってみる

f:id:Messerarche:20200429193415p:plain

これをリードレプリカ上で確認すると、ちゃんとコピーされていた。

 

しかし、慣れてなさすぎてセミコロン打ち忘れ多すぎわろた。

 データベースの扱い方自体もそのうち勉強せねばならんが、

今回はRDSを使うまでが目標なので、このくらいにしておく。

 

 

拡張モニタリングを有効にしたので、様子をみてみる。

CloudWatchさんが働いている模様

f:id:Messerarche:20200429194131p:plain

f:id:Messerarche:20200429194204p:plain



 

って、プルダウンから選ばないと拡張モニタリングにはならんらしい。

上のは無料で見れるんか

f:id:Messerarche:20200429194802p:plain

 

f:id:Messerarche:20200429194844p:plain

f:id:Messerarche:20200429194906p:plain

 

 

拡張モニタリングをオフにすれば、無料枠におさまるはずなので、オフにしておく。

しかし、わざわざRecommendationsで拡張モニタリングいいぞーっていうぐらいなので、本格運用時はオンのほうがいいのかなぁ。

f:id:Messerarche:20200429195016p:plain

 

 

 

データベースの停止も試す。

リードレプリカを先に削除、

f:id:Messerarche:20200429195344p:plain

 

結構厳重やな。

f:id:Messerarche:20200429195455p:plain

 

本体を削除。

f:id:Messerarche:20200429195603p:plain

スナップショットを残してくれる、と。

お試しなので別にいらんのだけど、保存のされ方を確認するために残しておく

 

できた。EC2でいうAMIみたいなものかな。

f:id:Messerarche:20200429202640p:plain

いらないので削除を選んだら、一瞬で消えた。

 

 

進捗

f:id:Messerarche:20200429202600p:plain

 

BLEのsnifferを作成する

仕事でBLE通信を扱うので、こちらも勉強を始めた。

Bluetooth Low Energyをはじめよう

とりあえずこの本を読んでみたが、専門用語が多く正直理解度はまだまだ。

ただ、WiresharkでBLEがパケットキャプチャできるツールが紹介されていたので

それを試してみることにした。

nRF Sniffer for Bluetooth LE - nordicsemi.com

パケットの息吹を感じれば理解も深まるはず

 

ということでRequired HardwareとなっているnRF52840 DKを入手。

海外から送られてきて1週間ぐらいで届いた。

f:id:Messerarche:20200430121701p:plain

ラズパイっぽい本体と、よくわからんタグが箱に入ってた。

正直この辺はど素人なので手探り感満載でセットアップしていく。

この英語のドキュメントをたぐればなんとかなると信じて。

Nordic Semiconductor Infocenter

 

f:id:Messerarche:20200430113648p:plain

 

Minimum requirements

f:id:Messerarche:20200430113814p:plain

 

この中で準備が必要そうなのはSEGGER J-Link Software

https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack

こちらのここからダウンロード。

f:id:Messerarche:20200430114002p:plain

今回はmacでやります

 

インストール開始

f:id:Messerarche:20200430120810p:plain

特に難しいところはないので割愛

 

f:id:Messerarche:20200430122124p:plain

NFC・・・え、もしかしてこのタグみたいなやつがNFC??

f:id:Messerarche:20200430122204p:plain

ささった・・・!

といってもこれ、スマホにnRF Toolboxというアプリをインストールするためだけっぽいので正直いらなかったかも(以降も特に出番なし)

 

 

f:id:Messerarche:20200430122258p:plain

 

a.PCとUSBケーブルでつなぐ→OK

b.SW9をVDDに。最初からVDDっぽい

f:id:Messerarche:20200430123052p:plain

c.SW8をON!

f:id:Messerarche:20200430123151p:plain

LEDが光り出した。

f:id:Messerarche:20200430124908p:plain

PCに認識された。

 

f:id:Messerarche:20200430123528p:plain

ここから用途に応じてソフト落としてこいってことかな?

今回はsniffer目的なのでこいつをダウンロード

nRF Sniffer for Bluetooth LE - nordicsemi.com

→nrf_sniffer_for_bluetooth_le_3.0.0_129d2b3.zipを入手。

 

次に、nRF snifferファームウェア

nRF Connect Programmerというソフトで書き込む。

nRF Connect for Desktop - nordicsemi.com

 

f:id:Messerarche:20200430155357p:plain

Programmerを選択

 

左上のselect deviceで今繋いでいるボードを選択

f:id:Messerarche:20200430155449p:plain

Readを押すとメモリの中身が見えるらしい。

f:id:Messerarche:20200430155800p:plain

何か出たけどなるほどわからん

 

 

Add HEX fileでファームを選択。

f:id:Messerarche:20200430155716p:plain

 

HEXファイルは先ほどダウンロードした

nrf_sniffer_for_bluetooth_le_3.0.0_129d2b3.zipの中にある

f:id:Messerarche:20200430160128p:plain

って・・・いっぱいある!どれやねん。

 

ドキュメントをよくよく探したら書いてあった。

f:id:Messerarche:20200430160336p:plain

今回52840を使っているので、PCA10056か。

 

選んだらこうなった。

f:id:Messerarche:20200430160652p:plain

左がBefore,右がAfter。中身は相変わらずわからんけども

 

Erase & writeで書き込み。

 

再度READしたら左と右の図の吹き出しに書いてあることが同じになったので、書き込めたっぽいw

 

 

次のステップへ

 

コマンドウィンドウでhexファイルのあった隣のフォルダ、extcapフォルダに移動

pip3 install -r requirements.txt

を実行。(PCにpythonがインストールされていることが前提。)

f:id:Messerarche:20200430161458p:plain

 

するっといくかと思いきや

f:id:Messerarche:20200430161607p:plain

 

Xcodeのライセンスに承諾しろと。

長々したライセンス文を読んだら承諾コマンドが最後に書いてあったので実行

f:id:Messerarche:20200430161748p:plain

 

って打ったら別の文章を読めとでてきたw

次の文章もハイハイと読んで

最後にagreeと打ってOKになったっぽい。

f:id:Messerarche:20200430161916p:plain

あらためてpip3 install -r requirements.txt実行。

sudoしてなくて怒られたのはさておき無事インストール完了。

 

Wiresharkを起動。(←入ってない人は別途インストール要)

Wireshark > About Wireshark(Macの場合)

からfoldersを選択

f:id:Messerarche:20200430175621p:plain



このURLをクリックして開いたフォルダに、extcapフォルダ内のデータをコピー

f:id:Messerarche:20200430175730p:plain



 

コマンドウィンドウで今コピーしてきたフォルダへ移動

f:id:Messerarche:20200430175710p:plain



nrf_sniffer_ble.sh --exrcap-interfaces

を実行。うまく通らない。

f:id:Messerarche:20200430170325p:plain

エラー文と中身から、パスの問題かな・・・?

f:id:Messerarche:20200430170408p:plain

 

./nrf_sniffer_ble.sh --extcap-interfaces

で動いた。

 

refresh interfaceをすると

f:id:Messerarche:20200430171512p:plain

 

 

インターフェースがでてきた。あとちょっとや!

f:id:Messerarche:20200430180206p:plain



 

 

プロファイルの設定

f:id:Messerarche:20200430175955p:plain



ここから開いたフォルダにあるprofiles配下に

Profile_nRF_Sniffer_Bluetooth_LEフォルダをそのままぶちこむ

f:id:Messerarche:20200430171901p:plain

 

configuration profileから

f:id:Messerarche:20200430172034p:plain

 

さっき追加したやつを選んでOK

f:id:Messerarche:20200430171948p:plain

 

これで準備はととのったっぽい

 

 

近くにBLE通信するデバイス達(セントラル+ペリフェラル)を置いて・・・

f:id:Messerarche:20200430180706p:plain

 

start!

f:id:Messerarche:20200430180312p:plain

 

おおおーー見えた!

満足したので中身をがっつり確認するのはまた今度。