AWS WAFを導入するための最低限必要な知識

AWS WAF(new)

古いものはclassicと表記されている。 今回検証対象としないため対象外

いわゆるWeb Application FireWallで。 SQLインジェクションとかXSSみたいな怪しいhttpリクエストをblockしてくれたりログ出してくれたりメトリクスを出してくれたりする。

設定対象

CloudFrontかALB(CLBは不可)にアタッチする。 akamaiやinacpsulaのようなCDN型みたいにCNAMEで指定するようなやり方では無い。 なのでオンプレとか他クラウドにアタッチはできない(ACMみたいなもん)

WEB ACL

名前の通りウェブアクセスコントロールリスト。 ブロックするアルゴリズムを設定する。 このACL自体にデフォルトアクションとしてallowとblockがある。

外部向けサービスなら基本的にallow 社内向けサービスとかで閉じたいならblock(cloudfront + s3みたいな構成でも使える。もちろんバケットポリシーでもいいが)

RuleGroup

ルールグループはルールの塊。 SQLインジェクションのルールとか。作る。 まずはマネージドルールを適用するところから始める。

自分でルールをカスタマイズもできるのでその場合はルールグループを作成することになる。

IP Sets

IPのホワイトリストブラックリストを作成するにはここで作成する。 RuleGroupとは別管理になるが。 WEB Acl側から見ると適用するルールの一つということになるのでこれもWEB ACLにセットすることになる。

AWSマネージドルール

AWSがあらかじめ用意してくれてるルールで、 terminatingRuleMatchDetails というSQLインジェクションXSSにおいて bodyのログを出してくれるのはマネージドルールだけ。

dev.classmethod.jp

今回はAMRsからCore rule setとSQL databaseを利用します。セットアップ方法は下記を参照してください。

クラスメソットさん参照

この後はWAF Charmとfirehose & s3を使ったログについて

s3のVPCエンドポイント情報

基本機能

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints.html

  • サブネット単位で設定可能 -- 実際はRouteTable単位

インターフェースエンドポイントとゲートウェイエンドポイントがある。 s3はゲートウェイエンドポイント。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpce-gateway.html

プレフィックスリストの ID の形式は pl-xxxxxxx で、プレフィックスリストの名前の形式は「com.amazonaws.region.service」

作るとこいう感じのリソースができるので、 これをサブネットのRouteTBLに追加すると設定される。

エンドポイントにはエンドポイントポリシーが割振れて、これでアクセスコントロールが出来る。 今はまだ全許可しかしてない。 (アウトバウンドを抑制するようなセキュリティ要件が厳しい場合に使用するのか?)

1 つの VPC 内に複数のエンドポイントを (複数のサービス用などに) 作成できます。また、1 つのサービス用に複数のエンドポイントを作成し、複数のルートテーブルを使用して、この同じサービスに複数のサブネットから異なるアクセスポリシーを適用することもできます。

なるほど。S3とDynamoDBと両方ともをVPCエンドポイントにする場合二つのエンドポイントを一つのRouteテーブルに紐付ける形になると。

きになる制限

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints-s3.html

エンドポイントポリシーでは、Docker イメージレイヤーを保存するために Amazon ECR で使用される Amazon S3 バケットへのアクセスを許可する必要があります。詳細については、Amazon Elastic Container Registry ユーザーガイドの「インターフェイス VPC エンドポイント (AWS PrivateLink)」を参照してください。

ECR使ってる場合ECRのバケットへの許可を明示的にやる必要がありそう。

特定の S3 バケットへのアクセスを制限するポリシーを作成できます。これは、VPC で S3 バケットを使用する他の AWS サービスがある場合に便利です。my_secure_bucket のみへのアクセスを制限するポリシーの例を次に示します。

なるほど。VPCエンドポイント側の設定でVPC内部のリソースからのアクセスを制御できると。

Amazon S3 バケットポリシーの使用

バケットポリシー側でもできると。 リクエストを出す側と受け付ける側。どちら側でやるかは好みだと思うけど。

それなりに複雑になってきてる構成の場合エンドポイントルールでやるのはそれなりに効率良さそう。

python3.6で文字リテラルに変数を組み込むf文字列

メモ書き程度に

s3のパスなんかを指定するときにディレクトリ名(擬似だが)指定するときに連結したりformatするよりもコレが便利だと思った

baccket_name = "hoge-bucket"
file_path = "/foo/bar/hogehoge.json"
s3_path = f"s3://{baccket_name}{file_path}"

fを先頭に入れてダブルクオートで括って、 {}で括って変数を入れる。

AWS GlueJob(Pythoh shell)でMySQL(RDS | Aurora MySQL compatible)に接続する

なぜだかは不明だが(pythonの事がわかってないからなのか)GlueのPython実行(PythonShel)にはMySQLへの接続ライブラリが無い。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/add-job-python.html

しょうがないので外部ライブラリとして作って自分のバケットにおいて読み込ませる事にした。

aws.amazon.com

ドキュメント漁ってもいまいち一気通貫に行かなかったので、 実際やったことを記録しておく。

ライブラリをローカルに取得してeggファイルを作る

git clone https://github.com/PyMySQL/PyMySQL.git 
cd PyMySQL/
python setup.py bdist_egg

これでdistディレクトリ配下にeggファイルが作成されるので。 この

PyMySQL-0.9.3-py3.6.egg

ファイルをGlueが読み込めるS3のバケットに配置してやる。

注意点

eggファイルを作る時のpythonバージョンとGlue上のPythonバージョンを揃える事。 このファイルを作った時は

Python 3.6.9

揃ってないとjob実行時にエラーになります。

S3の設定

Jobからread可能なS3の適当な場所にアップロードする

Glue側の設定

GlueのJob設定の

Python library path

という所にS3のフルパスを記入してやる。

s3://バケット/PyMySQL-0.9.3-py3.6.egg

みたいな感じ。 これで後は

import pymysql.cursors

みたいな感じでjobから読み出せる。

次はDataframe使っていい感じにETLする。

glueで開発エンドポイントを使用してdynamic dtaframe触って見たときの覚書

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-dynamic-frame.html#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-select_fields

# とりあえず必要そうなものと使いそうなものをimport
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
import datetime
import pprint

# サンプルソースから引っ張り、scはspark contextの実態の予定だったが実際はインスタンス化できず
# databaseurlはjdbc接続形式

glueContext = GlueContext(sc)
dynamicframe = glueContext.create_dynamic_frame.from_options(
    connection_type='mysql',
    connection_options={
    'url': database_url,
    'user': user_name,
    'password': password,
    'dbtable': table_name
})

# dynamic frameで実行(とりあえずこれで見られる)
dynamicframe.select_fields(['hoge', 'foo']).show()

# ざっくり全件みたいなら
dynamicframe.show()

# 件数知りたいなら
dynamicframe.count()

# 列を追加したい場合は一度sparkd dataframeに変換する


hoge = dynamicframe.toDF()

# 関数を使って挿入

hoge = hoge.withColumn('hoge_id', lit(999))

# dynamic frameに戻す
dynamicframe = dynamicframe.fromDF(hoge,glueContext ,dynamicframe)

# あとはs3に書いたりする

AWS認定ソリューションアーキテクト アソシエイト試験に合格してきたので学習内容について

タイトルの試験に合格してきたので記録!

aws.amazon.com

きっかけとか動機とか

以前から興味があったのですが、 re:ineventに行けそうなロードマップも見えてきたので「認定者ラウンジ入りたいなー」という不純な動機で始めました。 あとは「なんとなく周りで取得してる人増えてるなー」というちょっとしたコンプレックスもあったりして「エイや」で受験してきました。 割と他の人のブログも参考にしたのでこれも何かの参考になればなーと思い書いてみました。

学習開始時のスペック

  • AWS歴4,5年
  • 自社サービス向けのインフラ
  • 基本的に独学
  • 公式ドキュメントはあまり読まない(ダメすぎる)。クラスメソットのブログ読んでばかり。

学習期間と内容のサマリー

  • 大体1ヶ月くらい
  • 下段に書いていある参考書をひたすらやる
    • 下段で書きますが特に黒本は良かった気がする
  • 模試を受けた
    • 合格ライン取得
  • 模試後1週間後くらいに受験

試験内容の印象

  • 受験料高い
  • 模擬試験も受験料も半額ぐらいがいいなー。。。
  • いわゆる教科書とノートみたいな勉強スタイルから遠ざかっている体を「机に向かって勉強する」という状態に持って行くのにそれなりに時間かかった
    • 人によると思うのですが参考書を読んでるだけでは頭に入ってこなかった

結局試験である以上は受験勉強

当たり前の話なんですが、試験である以上やっぱり試験対策する必要があるなーと思いました。 当たり前ですが実務には時間制限とかそんなに無いですしドキュメントゆっくり読めばいいんですが。 試験である以上は時間内に正解を選ぶという試験ならではの事をしなくてはいけないので(それが良いとか悪いとかは別)。 それに応じた対策は必要ですねーという感じ。

あと普段自分があまり業務で関わってない機能をどれくらい補完できるかがポイントかなーという気がしました。 他のブログでもある通り結構広く浅く出てきます。cognitoとか全く使ってなかったので面食らった。

ソリューションアーキテクトという名前からやはりちょっとSIっぽい立ち位置の問題なのかなーという気がしました。

例えば私だと

私はそこそこサービスが大きくなってる自社開発向けのAWS使ってるエンジニアです。 そのためプロダクトのコード読んでる時間が多かったり。サードパーティツールの仕様調べてたりすること多いんですよね。そういう人結構多いんじゃ無いかなーと思ってます。

例えばVPCの設定とか最初にやっちゃったら中々変更することないから内容あまり覚えてないんですよね。

一例として試験の重要項目としてネットワークACLとセキュリテイグループの違いとかあるんですが、 ネットワークACLとか一度設定したら変更した事とか記憶になかったんです。セキュリティグループは変更多いですが。 といった事が色々。

勉強して良かった事とそうでもなかった事

  • EBSとかS3あたりは「まあなんとなくこんな感じで動くでしょ」って感じでやってた事がはっきりして良かった
  • EFS,ストレージゲートウェイとかオンプレ環境からのマイグレーションサービス系は単純に面白かった
  • RDSのスケールアウトとかロードバランサー置いてsslオフロードしてオートスケール してとか。その辺web三段構成のスケーラビリティ確保みたいなところは実運用に慣れてれば大した問題は出てこないと思います

という事で以下は勉強の記録です

参考書情報

通称黒本

これが一番役に立ったなーという印象。 主要機能の試験に出やすいところがしっかりまとまってます。 ストレージ周りとVPC周りはほぼ暗記するつもりでいていい気がします。

一番新しい参考書

受験1週間前くらいに出てちょっと面食らいました。

で、内容としては AWSの雰囲気を掴むには凄くいいのだけど内容が流石に薄いという印象です。

どの本もそうですが、 但し書きとして「公式ドキュメントをよく読んでください」とありますが。 流石にこれは端折り過ぎかなーという印象です。一方で「これは一応機能としてあるけど、実際はあんま使いませんよ」のような内容は結構良かったです。

試験対策する人が書いたというよりは、 割と実務的な人が書いたなーという印象です。

流石に内容が古いから買わなくていいかなと思います

black belt情報

とりあえずこんな感じで検索して出てきたslideを読む。

www.google.com

各機能の細かいところをどこら辺まで追う必要があるのかが難しいのですが、 少なくとも知らない機能をノートにまとめて行く。くらいはした方がいいと思います。 DynamoDBのグローバルテーブルとかDAXとかなんとなく知ってるけど使ってない。みたいな事が多かったです。

私が主に読んだのは

  • EBS
  • S3
  • EFS
  • VPC
  • RDS
  • Redshift
  • ElastiCache

あたりかなーと。ストレージ周りは結構しっかりおさらいしました。 基本的な使い方は知ってましたが、知らない機能を保管する意味で良かったです。

その他

最低限の学習環境はとりあえず用意した方がいいかなーと思います。 そこらへんに転がってるノート使ってもいいですが、 私はこれくらい揃えてちょうど良かったなと。

ルーズリーフを用意します

これに参考書の問題をひたすらやります

見出しを用意します

VPC, EBS, S3みたいな感じで分けておいて知らない機能を書いていきます

紙は多めに用意します

ボールペンでぐちゃぐちゃと汚く書くので多めに必要だと思います

多色ボールペンを用意して参考書に線を引きまくる(って事でリセールは気にしない)丸付けにも便利です

意味があるのかわからないけどなんとなく線を引きました、 そのため中古で売ることは出来ないです。

移動中も勉強するならペンを細いペンケースに入れておくと便利です

結果一発で合格しました

良かった良かった。

とにかく範囲が広いのがしんどいなーと思いました。 あとはテクニックとして消去法が重要だと思いました。 DynamoDBとRDSどっちでもできるような回答に対して「まあその用件ならこっちはあまり向いてないかな(一応オプションで出来る)」という判断が求められるのも結構あるので、 そこは自然な実装に寄せる考え方が必要かなーと思います(あまり深読みしない)。

という事で何かの参考になればと思います!

次はプロフェッショナル目指してみようかなと思ってます!

s3にhive形式で送信したい時の設定

aggregator nodeとかでs3でhive形式にしたい(athenaで使いたい時)時の最後のメモ

   <store>
      @type s3
      @id s3_nginx_json
      s3_bucket 私のバケット
      s3_region ap-northeast-1
      path nginx/${tag_parts[n]}/dt=%Y-%m-%d-%H/
      s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
      buffer_path /var/log/td-agent/buffer/s3/nginx/${tag_parts[n]}/
      buffer_chunk_limit 128m
      output_tag false
      output_time false
      flush_interval 10m
      time_slice_format %M
    </store>