AWSをいじり倒す(12.Amazon Lightsail)

今回は勉強ではなく、仕事でLightsailを使ってredmineサーバを建てることになったのでついでに記事化

 

そもそもLightsailとは何か

Amazon Lightsailとは?EC2との違いとメリット・デメリットを調べてみた | NHN テコラス Tech Blog | AWS、機械学習、IoTなどの技術ブログ

 

簡単に言うとAWSのパッケージ商品。

何も考えなくてもちゃんとした構成で用意してくれる。

 

何だかえらいポップな画面からスタート。

f:id:Messerarche:20200520192512p:plain

 

ロケーションの選択。国旗まで出しちゃってまあ。

f:id:Messerarche:20200520192647p:plain

明らかに他のサービスとは異質w

 

プラットフォームの選択

f:id:Messerarche:20200520192727p:plain

Windowsだとできることは現時点でほとんどなく、

Linux/Unixが主流のようだ

 

どのアプリ入れますか

f:id:Messerarche:20200520192831p:plain

複数選択はできない。今回はRedmine

 

キーペアの設定

f:id:Messerarche:20200520193157p:plain

デフォルトだと、キーの名前を自動生成してくれるみたい。

デフォルトキーを手元にダウンロードしておく。

 

スナップショットは・・・うーんいるようないらんような

f:id:Messerarche:20200520193403p:plain

月額$0.05/GBで、2回目以降は増分のみとのことなのでとりあえず有効化。

 

お値段。月額$3.5は安い。

f:id:Messerarche:20200520193439p:plain

派手な使い方しないしこれでよさそう。後から増築もできるし。

 

リソース名の設定とか、インスタンス数の指定とか。

f:id:Messerarche:20200520193736p:plain

このキータグはLightsailのリソースの中だけで使うものみたいだ。

用途は普通に管理のため。

Amazon Lightsail のタグ | Lightsail ドキュメント

でもわざわざキーオンリータグを準備した意味がわからん。キー値タグでいいやん

 

せっかくなのでつけてみた。

f:id:Messerarche:20200520195130p:plain

作成ボタンポチー

 

こんばんは!

f:id:Messerarche:20200520195324p:plain

過剰にユーザフレンドリー感だしてるなぁ。

AWSとっつきにくい人向けなのかね。

 

ほどなくしてできた。

f:id:Messerarche:20200520195835p:plain

f:id:Messerarche:20200520200205p:plain

独自のSSHクライアントも提供してくれているみたいだが、

IPとユーザ名と、先ほどダウンロードしたキーがあるので

EC2にアクセスするのと同じ要領でSSHで接続。

つながった

f:id:Messerarche:20200520200332p:plain

 

そしてこの黒塗りのところにブラウザからのログインパスワードが書いてある

f:id:Messerarche:20200520200954p:plain



パブリックIPをブラウザに放り込むと

f:id:Messerarche:20200520201501p:plain

 

無事表示された。

 

 

仕上げの設定。

IPアドレスの固定化。無料だから必ずやろう。

f:id:Messerarche:20200520202946p:plain

ネットワーキングから静的IPの作成

 

ロケーションは東京、インスタンスは先ほど作ったものを指定

f:id:Messerarche:20200520203041p:plain

 

静的IPの指定で一意な名前をつける

f:id:Messerarche:20200520203130p:plain

アタッチしている間は無料ですよ、と。

ちなみにアタッチしないと$0.005/h取られる模様。無駄に確保すんなってことね

 

作成を押すと静的IPが取得できた。アタッチもそのまましてくれたっぽい

f:id:Messerarche:20200520203400p:plain

 

早速このIPアドレスRedmineにログインできることが確認できた。

 

 

DNSの設定も行えるらしい。

静的IPを設定した後、新たなメニューが増えている

f:id:Messerarche:20200520204005p:plain

 

が、今回はLBも使わないので

ドメイン取得した場所で今取った静的IPアドレスを登録して

名前解決してやれば事足りてしまった。

ということで今回はAWSの設定見送り。

 

月額$3.5、遊びでポイポイたてるにはちと高いが、

ちゃんと使う目的で建てるなら安いし、何よりラクチンだ。

 

 

 

後日、HTTPS化を行った。

やり方は複数あるみたいで、

lightsailで立てたredmineHTTPS化する手順を書いたサイトを探したが、

certbot-autoを入れるやり方はredmine 404 errorとでてうまくいかん。

結局、lego clientを使うこれでうまくいった。

Generate and Install a Let's Encrypt SSL Certificate for a Bitnami Application

lightsail環境だとApacheが動いているみたいなのでApacheの場合を選んでいけばOK。

bitnami公式ドキュメントだから手順も安心

このサイトにたどり着くまでに3時間、たどり着いてからは10分でできた。。。

 

 

進捗

f:id:Messerarche:20200520211343p:plain

 

 

AWSをいじり倒す(11.リソースグループ)

組織アカウントを使っている関係で、人目に付かないところでテストを行おうと思ってオハイオリージョンで作業をしていたのだが、リソースグループ機能使えば同一リージョンでも見えなくできるのでは?という話がでたので試してみる。(Azureのリソースグループ機能ならそういうことができるらしい。)

 

ちなみに先に結論を書いておくと、残念ながら見えなくすることはできないみたいだ。

AWSマネジメントコンソールにおいて、IAMユーザごとに参照(表示)できるEC2インスタンスを制御したい - Qiita

ここに書いてあるように、人目から隠すなら(今の自分の環境では)リージョンを変えるのが最良。

 

 

ただ、色々触っているせいでサービスが乱立しているのは間違い無いので、

管理のためにリソースグループを使ってみる。

AWS リソースグループ とは? - AWS リソースグループ

 

手順はこちらを参考に

[AWS]リソースグループを使って、テスト・ステージング・本番環境ごとにAWSリソースを管理する | Developers.IO

 

ここから設定開始

f:id:Messerarche:20200519123021p:plain

 

グループの作成

f:id:Messerarche:20200519123140p:plain

 

リソースタイプは全て、でいいとして

タグ・・・

f:id:Messerarche:20200519123524p:plain

ああ〜〜こうなるのかー。今まで適当につけてきたツケがw

統一しとけばよかった

タグもNameじゃなくて、リソースグループ用のタグを1個作った方がよさそう

 

 

そんなあなたにタグエディター。タグをまとめて変更できる便利な機能。

f:id:Messerarche:20200519125044p:plain

f:id:Messerarche:20200519125023p:plain

 

 

条件を指定して検索し、出てきたリソースを選んで、タグを管理するボタンを押す

f:id:Messerarche:20200519125132p:plain

 

 

Nameは個を識別するために残しておきたいので、

envというタグを作り(何でもいいが参考にしていた記事がenvとつけたので真似した)

今回の作業に関するもの全てにproject-testとつけることにした

f:id:Messerarche:20200519125239p:plain

 

 

こんな感じでまとめて設定される

f:id:Messerarche:20200519125629p:plain

この調子で今まで作ってきたリソースにポチポチとenvタグをつけていく

 

 

改めてリソースグループ作成画面に戻って、

env project-testを指定

f:id:Messerarche:20200519130107p:plain

 

一つのタグでずらずらでるようになった。

f:id:Messerarche:20200519130249p:plain

 

 

グループ名と、このグループそのものにつけるタグの設定。

f:id:Messerarche:20200519130343p:plain

 

 

できた。

f:id:Messerarche:20200519124724p:plain

 

 

使い方。

 

 

色々探したが、下図のような参考記事にある超便利そうな画面が出したいのに見当たらない・・・。なんで?

f:id:Messerarche:20200519133911p:plain

 

リソースグループの画面から、まとめあげた各リソースにアクセスできるのは確認。

f:id:Messerarche:20200519133742p:plain

便利かもしれないがレイアウトが不満だなぁ。

 

 

また、タグを使って絞り込むことは可能だけど

f:id:Messerarche:20200519135051p:plain

あくまでただのタグによる絞り込みなので、リソースグループの便利さってわけではない。

 

では、どんな時にリソースグループを使えばいいのか。

複数人で管理する時に、作った本人はどんなサービス使ってるかだいたい把握しているけど別の人がみる場合はどこで何使っているのかわからないので、リソースグループとしてまとまってみれたほうがありがたい、とか。

 

また、リソースグループをRun Commandの対象にできるらしいので、これを使う場合は便利かも。

Run Commandのターゲットとしてリソースグループが選択可能になりました | Developers.IO

 

ということでリソースグループそれ自体はふーんという感じだが

タグは個を識別するNameと、グループを識別するenvの2つつけていきましょうってのが今回の学び。

AWSをいじり倒す(10.Route53)

もっと早くにやれば良かったと思いつつ、DNSサービスたるRoute53を触ってみる。

具体的には、

Route53 でDNSフェイルオーバーを設定する。 - Qiita

を参考にして、DNSフェイルオーバーを使ったsorryページ表示を試してみることにする

ELBは対象をEC2にしかできない(その分ヘルスチェックをきめ細やかに設定できる)がDNSフェイルオーバーはEC2、S3、ELBを対象にできる。

また、S3で簡易なHP(sorryページ用)を作れるというのも面白い点だ

 

まずは思い出しながらELB環境を作成。

f:id:Messerarche:20200519210251p:plain

ELBからは(無駄に)AutoScailingで作成した2台のEC2がぶら下がっており、

そのどちらでもWebサーバが立っている状態。

 

 

 

次にS3にsorryページを作ってみる。

ちなみに、バケット名はドメイン名と同一にしなければならないという注意書きがあるのだが、この時点ではその意味がよく理解できていないので名前は後で変更する。

(変更というか、削除して作り直す)

f:id:Messerarche:20200519211528p:plain

 

 

Static website hositingから

f:id:Messerarche:20200519211632p:plain

ウェブサイトをホストしますを選択し

インデックスドキュメントの名前(index.html)を書いて、保存。

 

せっかくなのでAWS CLIを使って、index.htmlを送り込むことにする

適当なEC2上で20年前ぐらいに覚えた化石htmlでindex.htmlを作成し、保存

f:id:Messerarche:20200519214712p:plain

 

アップロード実行

f:id:Messerarche:20200519214916p:plain

 

この状態で直接アクセスしてみたらどうなるのか試してみたら

f:id:Messerarche:20200519215140p:plain

AccessDenied。S3のパブリックアクセスの設定してないせいだとおもう。

 

こいつのチェックを外して再トライしてみる

f:id:Messerarche:20200519215220p:plain

 

f:id:Messerarche:20200519215433p:plain

・・・だめですね。

 

index.htmlの権限を確認してみる。アクセス権限のところをクリック。

f:id:Messerarche:20200519215759p:plain

 

出てきた画面

f:id:Messerarche:20200519215555p:plain

ここのパブリックアクセスの許可っぽいな〜〜

 

読み取り許可を出して保存。

f:id:Messerarche:20200519215649p:plain

 

リトライ結果やいかに

f:id:Messerarche:20200519215907p:plain

でた!

静的なHPであればもうこれでいいんじゃ無いのってぐらい簡単だ。

まあでもS3ってダウンロード量に応じてお金がかかるから、アクセスされればされるほどお金取られることになる。そう思うと動画コンテンツとかうかうか載せてらんないし、sorryページ利用ぐらいがちょうどいいのかもしれん。

S3なら絶対にダウンしないのも魅力。耐久性99.999999999%は伊達じゃない。

 

 

さて、次にRoute53を設定していく

 

ヘルスチェックの設定。このOKNG結果でフェイルオーバーを機能させることになる。

f:id:Messerarche:20200519220633p:plain

 

ヘルスチェックの環境設定

f:id:Messerarche:20200519223803p:plain



まずはELBのヘルスチェック設定ということで名前にELBを入れた。

他のヘルスチェックのステータス・・・でELBのヘルスチェックが指定できるのかな?と一瞬思ったが、どうも違うらしい

Amazon Route 53 がヘルスチェックの正常性を判断する方法 - Amazon Route 53

Route53内でヘルスチェックに親子関係を作って、子のヘルスチェック結果を親が利用する・・・と読めた。

今回はエンドポイントを選択。

 

監視対象の設定

f:id:Messerarche:20200519223832p:plain

ドメイン名指定で、ELBのドメインを指定

 

高度な設定

f:id:Messerarche:20200519224314p:plain

文字列マッチングというのが気になった。

ポーリングのレスポンスに含まれる文字列をみて、指定文字列が入ってて初めてOKと見なすものらしい。いつ使うんだろうと思って調べたら、事例を見つけた。

Route53 ヘルスチェックのエンドポイント設定のわな - Qiita

へぇ〜

 

最後に通知設定

f:id:Messerarche:20200519224730p:plain

作成。

 

 

 

S3版ヘルスチェックも作成する

f:id:Messerarche:20200519225112p:plain

 

結果を見てみると

f:id:Messerarche:20200519225315p:plain

 

ELBがうまくいってない。各地のヘルスチェッカーさんがFailureを出している。

 

そういやセキュリティーグループの設定はどうなってたっけ。

f:id:Messerarche:20200519225541p:plain

黒塗りしているが、マイIPしか許可していなかったw

 

う〜ん、でもこのブログに堂々とドメインとか書いているので

誰からもアクセスOKにはしたくない・・・せや!

 

これを・・・

f:id:Messerarche:20200519230006p:plain


こうして・・・・

f:id:Messerarche:20200519230040p:plain

 

こうじゃ

f:id:Messerarche:20200519230122p:plain

 

 

正常で結果もSuccessとなったのでヨシ!

f:id:Messerarche:20200519230632p:plain

 

 

いよいよDNSフェイルオーバーの作成・・・がここで引っかかる。

DNSフェイルオーバーを設定してみたというブログ記事はいくつか見かけたが

どれもこれも既に独自のドメイン名を取得している状態から始まっており

今回のように0から設定する時のことが考えられた記載になっていないようだ。訴訟!

 

このように最初、ホストゾーン設定は空である。

f:id:Messerarche:20200519231444p:plain

 

さらにこのドメイン名、AWSで取得すると結構な金がかかる。

詳しくはここに書いてあるが、年間契約でどんなに安くても9$からっぽい。

さすがに使い捨てに1000円はかけられない・・・。

 

ということで無料ドメインを取ってくることにするが

最終的にIPアドレスに解決するのはAWSなので、AWSのネームサーバに名前解決を委託

つまりNSレコードがかける無料DNSサーバでないといけない

・・・これがなかなか見当たらない。

AWS Route 53を使って独自ドメインのWebページを表示させてみよう | Avintonジャパン株式会社

うまくいっている例っぽいこれを参考にfreenomもアクセスしてみたが、ドメインが取得不可と出て前に進まない、困った。

 

 

苦肉の策として、ゴリ押しで架空ドメインを登録することにした。

まずは、適当に

test12345domain.ddns.net

を使うことに決める。

 

 

で、これを先ほどのドメイン名のところに放り込んで、

パブリックホストゾーンで登録

f:id:Messerarche:20200519234619p:plain

 

するとこの

test12345domain.ddns.netを

解決してくれるネームサーバ一覧が見えるようになる。

f:id:Messerarche:20200520010704p:plain

 

 

 

フェイルオーバーの設定兼、このドメインを何のIPで解決したらいいかを設定する。

f:id:Messerarche:20200519234839p:plain

レコードセットの作成から

Aレコードの設定。エイリアス先にELBのDNSを指定。

f:id:Messerarche:20200519235536p:plain

これでweb.test12345domain.ddns.netをAWSのネームサーバに聞きにきたら、

ELBのドメイン名(で解決できるIPアドレス)を返却してくれるようになる。

ルーティングポリシーはフェイルオーバーにして、こちらはプライマリ

 

ヘルスチェックとの関連付けも有効にして、先ほど作ったヘルスチェックを指定

f:id:Messerarche:20200519235713p:plain

 

作成。

 

さて、改めて今どういう状況かというと、

普段インターネットを使う環境で名前解決しようとすると失敗する。

なぜならweb.test12345domain.ddns.netは世界に向けて公開されていないからだ。

f:id:Messerarche:20200520010445p:plain

(この世界に向けて公開、というのが無料DNSサービスにお願いしようとしていた部分であり、AWSにお願いすると1000円取られる部分である。)

 

でも、AWSのネームサーバさんに直接、お前知ってるよな?と聞くと答えてくれる!

さきほど教え込んだからだ。

f:id:Messerarche:20200520010525p:plain

 

あとはパソコンのDNSサーバ設定を

awsのネームサーバに指定してしまえばゴリ押しの完成である。

Macだとここ。WindowsならIPアドレス設定するところの下のほうに入力できる

f:id:Messerarche:20200520024028p:plain

 

パソコンの設定を変えたあとはコマンド上でDNSサーバ指定しなくても名前解決できる。

f:id:Messerarche:20200520011923p:plain

この状態でブラウザにweb.test12345domain.ddns.netを放り込むと

ELB越しにEC2で動いているWebサーバのページが表示された。

 

フェイルオーバーの設定を続ける。フェイルオーバー先のS3について、

前述の通りS3のバケット名は「S3のバケット名をプライマリサイトのドメイン名と同じにする」ことが必要なので、改めて作成する。

つまり今回はweb.test12345domain.ddns.netという名前のバケットが必要ということになる。

f:id:Messerarche:20200520012548p:plain

こんなかんじ。index.htmlの設置などは先に説明した通りなので割愛。

 

Route53に戻ってきて、再度レコードセットを作成する。

f:id:Messerarche:20200520012704p:plain

エイリアス先に今作ったS3を指定する。

フェイルオーバーをセカンダリにして、

ヘルスチェックとの関連付けも、はいに。

バケット名変えたのでヘルスチェックの対象設定も変更しなおした。)

これで、設定は完了。

 

ようやくテストを行っていく。

まずは普通に繋がることを確認。

f:id:Messerarche:20200520014316p:plain

 

次に、ELB配下のEC2を停止する

f:id:Messerarche:20200520014343p:plain

するとこいつらへのヘルスチェックが失敗して・・・

f:id:Messerarche:20200520014430p:plain

切り替わる!

f:id:Messerarche:20200520014444p:plain

しばらくのち、Auto-Scalingが働いて新しいEC2が建つ

f:id:Messerarche:20200520014559p:plain

 

ホームページ復活。

f:id:Messerarche:20200520014316p:plain

 

きれいに動いた〜!

欲を言うと、フェイルオーバーの切り替わりにはそこそこ時間がかかったので

ヘルスチェックの間隔はもっと短くていいと思った。

今は30秒間隔で3回失敗したら異常と判定するので切り替わりに90秒かかる。

10秒間隔にも設定できるので、早く切り替えたい場合はこちらかな。

 

途中謎の工夫をしたせいでめちゃめちゃ時間がかかってしまった

ホストゾーン設定も存在しているだけで毎月そこそこのお金を取られるらしいので、最後に全消しして、終わり。Webページ用のS3も削除。

本記事に書いてあるIPやドメインにアクセスしても繋がらないのであしからず。

 

 

進捗。いい加減図を整理しないと辛くなってきたぞ

f:id:Messerarche:20200520022336p:plain

 

 

 

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