Slide 1

Slide 1 text

Athenaのパーテション設定を CloudWatch Events + Lambda で自動化する 2019/1/20(日) ShinjukuLT

Slide 2

Slide 2 text

もくじ - 自己紹介 - Athenaとは - なぜパーティション設定を自動化したいか - なぜ Lambda + CloudWatch Event か - apexでの構築 - はまったところ - まとめ

Slide 3

Slide 3 text

もくじ - 自己紹介 - Athenaとは - なぜパーティション設定を自動化したいか - なぜ Lambda + CloudWatch Event か - apexでの構築 - はまったところ - まとめ

Slide 4

Slide 4 text

srttk jisibari .inc Twitter: @_srttk Github: srttk 4

Slide 5

Slide 5 text

もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda + CloudWatch Event か - apexでの構築 - はまったところ - まとめ

Slide 6

Slide 6 text

Athena とは - AWSのサービス - S3のデータをSQLで検索できる - サーバーレス - スキャン量課金

Slide 7

Slide 7 text

Athena とは - AWSのサービス - S3のデータをSQLで検索できる - サーバーレス - スキャン量課金 BigQueryのAWS版みたいなもの

Slide 8

Slide 8 text

Athena とは - AWSのサービス - S3のデータをSQLで検索できる - サーバーレス - スキャン量課金 BigQueryのAWS版みたいなもの LBのログとかにいい感じにSQL投げれる

Slide 9

Slide 9 text

Athena とは - AWSのサービス - S3のデータをSQLで検索できる - サーバーレス - スキャン量課金 BigQueryのAWS版みたいなもの LBのログとかにいい感じにSQL投げれる 便利

Slide 10

Slide 10 text

どう使うの? - AWSコンソールでCREATE TABLE文をうつ - おしまい

Slide 11

Slide 11 text

どう使うの? - AWSコンソールでCREATE TABLE文をうつ - おしまい 簡単

Slide 12

Slide 12 text

LBのログはこんな感じ

Slide 13

Slide 13 text

LBのログはこんな感じ 長くて見えない

Slide 14

Slide 14 text

LBのログだとこんな感じ 長くて見えない 公式にがっつり載ってます https://docs.aws.amazon.com/ja_jp/athen a/latest/ug/application-load-balancer-logs. html

Slide 15

Slide 15 text

もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda + CloudWatch Event か - apexでの構築 - はまったところ - まとめ

Slide 16

Slide 16 text

Athenaのパーティションとは - テーブルのデータを分離する機能 - 特定パーティションのみをクエリ対象にできる - クラウド死を避けるために必要

Slide 17

Slide 17 text

Athenaのパーティションとは - テーブルのデータを分離する機能 - 特定パーティションのみをクエリ対象にできる - クラウド死を避けるために必要

Slide 18

Slide 18 text

Athenaのパーティションとは - テーブルのデータを分離する機能 - 特定パーティションのみをクエリ対象にできる - クラウド死を避けるために必要 具体的な設定方法を説明します

Slide 19

Slide 19 text

テーブルのデータを 分離

Slide 20

Slide 20 text

テーブル作成時にパーティション宣言が必要

Slide 21

Slide 21 text

拡大

Slide 22

Slide 22 text

拡大 簡単

Slide 23

Slide 23 text

パーティションの割り当ても必要

Slide 24

Slide 24 text

パーティションの割り当ても必要 S3のパスがHive形式だと 割り当ては省略できるよ

Slide 25

Slide 25 text

パーティションの割り当ても必要 S3のパスがHive形式だと 割り当ては省略できるよ くわしくはこちら https://docs.aws.amazon.com/ja_jp/athen a/latest/ug/partitions.html

Slide 26

Slide 26 text

パーティション割り当てはクエリを発行するしかない - いちいちクエリを打たないといけない - 正気か!?? - 自動化しないと終わる

Slide 27

Slide 27 text

パーティション割り当てはクエリを発行するしかない - いちいちクエリを打たないといけない - 正気か!?? - 自動化しないと終わる LBさん、自動で掘るS3のパス Hive形式にしてほしかったな。。。

Slide 28

Slide 28 text

特定パーティションを クエリ対象にする

Slide 29

Slide 29 text

ふつうにwhereで引っ掛けます

Slide 30

Slide 30 text

ふつうにwhereで引っ掛けます 今回の例だと、年と月のセットで whereかけたいのでconcatしてます

Slide 31

Slide 31 text

ふつうにwhereで引っ掛けます 今回の例だと、年と月のセットで whereかけたいのでconcatしてます yearだけでwhereしないなら 分けなくてもいいかも

Slide 32

Slide 32 text

もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda + CloudWatch Event か - apexでの構築 - はまったところ - まとめ

Slide 33

Slide 33 text

なぜ Lambda + CloudWatch Event か - サーバー管理したくなかった - jenkinsその他ツールに依存したくない - 独立したできるだけ小さい構成にしたかった

Slide 34

Slide 34 text

なぜ Lambda + CloudWatch Event か - サーバー管理したくなかった - jenkinsその他ツールに依存したくない - 独立したできるだけ小さい構成にしたかった Athenaもサーバーレスだし サーバーレスにしたかった

Slide 35

Slide 35 text

もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda + CloudWatch Event か - apexでの構築 - はまったところ - まとめ

Slide 36

Slide 36 text

apexとは - lambda関数の管理ができるサードパーティーツー ル - デプロイ、ドライラン、関連インフラの生成などが 可能 - インフラ構築は内部でterraformを利用している

Slide 37

Slide 37 text

apexとは - lambda関数の管理ができるサードパーティーツー ル - デプロイ、ドライラン、関連インフラの生成などが 可能 - インフラ構築は内部でterraformを利用している `apex infra` サブコマンドで インフラ管理できる。 実装はterraformをexecしてるだけ

Slide 38

Slide 38 text

apexとは - lambda関数の管理ができるサードパーティーツー ル - デプロイ、ドライラン、関連インフラの生成などが 可能 - インフラ構築は内部でterraformを利用している `apex infra` サブコマンドで インフラ管理できる。 実装はterraformをexecしてるだけ だからplanとかapplyとかできる

Slide 39

Slide 39 text

apexとは - lambda関数の管理ができるサードパーティーツー ル - デプロイ、ドライラン、関連インフラの生成などが 可能 - インフラ構築は内部でterraformを利用している `apex infra` サブコマンドで インフラ管理できる。 実装はterraformをexecしてるだけ だからplanとかapplyとかできる https://github.com/apex/apex/blob/453c83 c5a12940de117e080c50a72dfa4f7a6b6a/ nfra/infra.go#L38-L45

Slide 40

Slide 40 text

なぜ AWS SAM じゃないのか - SAMはインフラ管理を CloudFormation で行う - インフラ管理はだいたいansibleやterraformなどの 管理ツールでコード化されているはず - 管理が二重になるので CloudFormation と相性が 悪い

Slide 41

Slide 41 text

なぜ AWS SAM じゃないのか - SAMはインフラ管理を CloudFormation で行う - インフラ管理はだいたいansibleやterraformなどの 管理ツールでコード化されているはず - 管理が二重になるので CloudFormation と相性が 悪い AWSリソース自身に 他のリソースについて言及されると 収集つかなくなる

Slide 42

Slide 42 text

なぜ AWS SAM じゃないのか - SAMはインフラ管理を CloudFormation で行う - インフラ管理はだいたいansibleやterraformなどの 管理ツールでコード化されているはず - 管理が二重になるので CloudFormation と相性が 悪い AWSリソース自身に 他のリソースについて言及されると 収集つかなくなる SAMはそれ単体で完結するのが強い apexはterraformからインフラを管理するか ら整合性を取りやすい

Slide 43

Slide 43 text

なぜ AWS SAM じゃないのか - SAMはインフラ管理を CloudFormation で行う - インフラ管理はだいたいansibleやterraformなどの 管理ツールでコード化されているはず - 管理が二重になるので CloudFormation と相性が 悪い AWSリソース自身に 他のリソースについて言及されると 収集つかなくなる SAMはそれ単体で完結するのは強い apexはterraformからインフラを管理するか ら整合性を取りやすい 今回はapexが向いていた (既存インフラ管理がterraformだったため)

Slide 44

Slide 44 text

気をつけること - インフラ構築とlambda本体のデプロイの順番を考 慮する必要がある

Slide 45

Slide 45 text

気をつけること - インフラ構築とlambda本体のデプロイの順番を考 慮する必要がある どういうこと?

Slide 46

Slide 46 text

IAM role と lambda の場合 - 初手 `apex deploy`

Slide 47

Slide 47 text

IAM role と lambda の場合 - 初手 `apex deploy` Lambda実行用の IAM role が未定義なのでエラー

Slide 48

Slide 48 text

IAM role と lambda の場合 - 初手 `apex deploy` Lambda実行用の IAM role が未定義なのでエラー - `apex infra apply` - AWSコンソールからIAM roleをコピー - apexの設定ファイルに移す - `apex deploy`

Slide 49

Slide 49 text

IAM role と lambda の場合 - 初手 `apex deploy` Lambda実行用の IAM role が未定義なのでエラー - `apex infra apply` - AWSコンソールからIAM roleをコピー - apexの設定ファイルに移す - `apex deploy` 成功!

Slide 50

Slide 50 text

IAM role と lambda の場合 - 初手 `apex deploy` Lambda実行用の IAM role が未定義なのでエラー - `apex infra apply` - AWSコンソールからIAM roleをコピー - apexの設定ファイルに移す - `apex deploy` 成功! こういうことです

Slide 51

Slide 51 text

IAM role と CloudWatch Event と lambda の場合 - `apex infra apply` から始める

Slide 52

Slide 52 text

IAM role と CloudWatch Event と lambda の場合 - `apex infra apply` から始める lambdaがまだ存在しないのでCloudWatch Eventが 作れなくてエラー

Slide 53

Slide 53 text

IAM role と CloudWatch Event と lambda の場合 - Terraformをmodule化する - `apex infra apply -target=module.your_iam_module` - AWSコンソールからIAM roleをコピー - apexの設定ファイルに移す - `apex deploy` - `apex infra apply -target=module.your_cloudwatch_event_module`

Slide 54

Slide 54 text

IAM role と CloudWatch Event と lambda の場合 - Terraformをmodule化する - `apex infra apply -target=module.your_iam_module` - AWSコンソールからIAM roleをコピー - apexの設定ファイルに移す - `apex deploy` - `apex infra apply -target=module.your_cloudwatch_event_module` 成功

Slide 55

Slide 55 text

IAM role と CloudWatch Event と lambda の場合 - Terraformをmodule化する - `apex infra apply -target=module.your_iam_module` - AWSコンソールからIAM roleをコピー - apexの設定ファイルに移す - `apex deploy` - `apex infra apply -target=module.your_cloudwatch_event_module` 成功 つら

Slide 56

Slide 56 text

IAM role と CloudWatch Event と lambda の場合 - Terraformをmodule化する - `apex infra apply -target=module.your_iam_module` - AWSコンソールからIAM roleをコピー - apexの設定ファイルに移す - `apex deploy` - `apex infra apply -target=module.your_cloudwatch_event_module` 成功 つら とはいえ一度デプロイしたら のちの更新は `apex infra apply` だけでいい

Slide 57

Slide 57 text

IAM role と CloudWatch Event と lambda の場合 - Terraformをmodule化する - `apex infra apply -target=module.your_iam_module` - AWSコンソールからIAM roleをコピー - apexの設定ファイルに移す - `apex deploy` - `apex infra apply -target=module.your_cloudwatch_event_module` 成功 つら とはいえ一度デプロイしたら のちの更新は `apex infra apply` だけでいい apexの嬉しい部分と 天秤にかけて、 採用するか決めると良さそう

Slide 58

Slide 58 text

具体的なコードについて - 量の関係で省略します - この記事が参考になると思います(少し古いです が) https://dev.classmethod.jp/cloud/aws/ami-and- snapshot-delete-with-apex-and-terraform/

Slide 59

Slide 59 text

もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda + CloudWatch Event か - apexでの構築 - はまったところ - まとめ

Slide 60

Slide 60 text

Lambda用のAthenaの実行ロール - Athena本体はFullAccessでいい - AthenaはS3に対しても読み込み等権限が必要 - とはいえAthenaの処理でS3のどのような権限が必 要なのかわかりづらい - 調べるのにそこそこ時間を使ってしまった

Slide 61

Slide 61 text

Lambda用のAthenaの実行ロール - Athena本体はFullAccessでいい - AthenaはS3に対しても読み込み等権限が必要 - とはいえAthenaの処理でS3のどのような権限が必 要なのかわかりづらい - 調べるのにそこそこ時間を使ってしまった ここに載ってました https://docs.aws.amazon.com/ja_jp/athen a/latest/ug/cross-account-permissions.htm l

Slide 62

Slide 62 text

Lambda用のAthenaの実行ロール - Athena本体はFullAccessでいい - AthenaはS3に対しても読み込み等権限が必要 - とはいえAthenaの処理でS3のどのような権限が必 要なのかわかりづらい - 調べるのにそこそこ時間を使ってしまった ここに載ってました https://docs.aws.amazon.com/ja_jp/athen a/latest/ug/cross-account-permissions.htm l Gist書いたので よければ参考にしてください

Slide 63

Slide 63 text

Lambda用のAthenaの実行ロール - Athena本体はFullAccessでいい - AthenaはS3に対しても読み込み等権限が必要 - とはいえAthenaの処理でS3のどのような権限が必 要なのかわかりづらい - 調べるのにそこそこ時間を使ってしまった ここに載ってました https://docs.aws.amazon.com/ja_jp/athen a/latest/ug/cross-account-permissions.htm l Gist書いたので よければ参考にしてください https://gist.github.com/srttk/985f8ef07c29e 57e1ff89689105274e1

Slide 64

Slide 64 text

パーティション発行スクリプトのパス指定ミス - Lambda発行スクリプトはGoで書いてた - 月の取得を time.Time.Month() でやってた - time.Time.Month() はゼロパディングなしの現在の 月を取得する関数(1とか12とか) - LBはYYYY/MM/DDでパスを掘る

Slide 65

Slide 65 text

ようするにこういうクエリを発行してしまった

Slide 66

Slide 66 text

対策 - time.Time.Format(“01”) で月を取得する - Goのtimeのフォーマットについては https://qiita.com/ruiu/items/5936b4c3bd6eb48 7c182 が詳しい

Slide 67

Slide 67 text

対策 - time.Time.Format(“01”) で月を取得する - Goのtimeのフォーマットについては https://qiita.com/ruiu/items/5936b4c3bd6eb48 7c182 が詳しい 詳しいフォーマットについてはソースをみてい るとconst定義されてます

Slide 68

Slide 68 text

対策 - time.Time.Format(“01”) で月を取得する - Goのtimeのフォーマットについては https://qiita.com/ruiu/items/5936b4c3bd6eb48 7c182 が詳しい 詳しいフォーマットについてはソースをみてい るとconst定義されてます https://github.com/golang/go/blob/5538a9 a34fc4e395967c0233aab5bdde0cebbf9b/ src/time/format.go#L90-L122

Slide 69

Slide 69 text

もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda + CloudWatch Event か - apexでの構築 - はまったところ - まとめ

Slide 70

Slide 70 text

まとめ - apex, dry-runとか環境分けたりとかlocal実行とかで きて便利 - インフラ構成も考慮に入れると手順がだるい - Lambdaのサイズ間によっては直接terraformで書 いた方が楽かも - Athenaを叩く実行ロールはS3周りがだるいので覚 えておくと楽 - 初歩的ですがYYYY/MM/DDには気をつけてくださ い

Slide 71

Slide 71 text

まとめ - apex, dry-runとか環境分けたりとかlocal実行とかで きて便利 - インフラ構成も考慮に入れると手順がだるい - Lambdaのサイズ間によっては直接terraformで書 いた方が楽かも - Athenaを叩く実行ロールはS3周りがだるいので覚 えておくと楽 - 初歩的ですがYYYY/MM/DDには気をつけてくださ い みなさんもよきLambdaライフを!

Slide 72

Slide 72 text

- プレゼンテーションテーマは SlidesCarnival の ヨークプレゼンテーションテンプレー ト を利用しています クレジット表記

Slide 73

Slide 73 text

ご静聴ありがとう ございました