Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Athenaのパーテション設定をCloudWatch Events + Lambda で自動化する

66487f93d23ed4f64752cffbafdb938a?s=47 convto
January 20, 2019

Athenaのパーテション設定をCloudWatch Events + Lambda で自動化する

66487f93d23ed4f64752cffbafdb938a?s=128

convto

January 20, 2019
Tweet

More Decks by convto

Other Decks in Programming

Transcript

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

  2. もくじ - 自己紹介 - Athenaとは - なぜパーティション設定を自動化したいか - なぜ Lambda

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

    + CloudWatch Event か - apexでの構築 - はまったところ - まとめ
  4. srttk jisibari .inc Twitter: @_srttk Github: srttk 4

  5. もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda

    + CloudWatch Event か - apexでの構築 - はまったところ - まとめ
  6. Athena とは - AWSのサービス - S3のデータをSQLで検索できる - サーバーレス - スキャン量課金

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

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

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

    BigQueryのAWS版みたいなもの LBのログとかにいい感じにSQL投げれる 便利
  10. どう使うの? - AWSコンソールでCREATE TABLE文をうつ - おしまい

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

  12. LBのログはこんな感じ

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

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

  15. もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda

    + CloudWatch Event か - apexでの構築 - はまったところ - まとめ
  16. Athenaのパーティションとは - テーブルのデータを分離する機能 - 特定パーティションのみをクエリ対象にできる - クラウド死を避けるために必要

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

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

  19. テーブルのデータを 分離

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

  21. 拡大

  22. 拡大 簡単

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

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

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

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

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

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

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

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

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

  32. もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda

    + CloudWatch Event か - apexでの構築 - はまったところ - まとめ
  33. なぜ Lambda + CloudWatch Event か - サーバー管理したくなかった - jenkinsその他ツールに依存したくない

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

    - 独立したできるだけ小さい構成にしたかった Athenaもサーバーレスだし サーバーレスにしたかった
  35. もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda

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

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

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

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

    infra` サブコマンドで インフラ管理できる。 実装はterraformをexecしてるだけ だからplanとかapplyとかできる https://github.com/apex/apex/blob/453c83 c5a12940de117e080c50a72dfa4f7a6b6a/ nfra/infra.go#L38-L45
  40. なぜ AWS SAM じゃないのか - SAMはインフラ管理を CloudFormation で行う - インフラ管理はだいたいansibleやterraformなどの

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

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

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

    管理ツールでコード化されているはず - 管理が二重になるので CloudFormation と相性が 悪い AWSリソース自身に 他のリソースについて言及されると 収集つかなくなる SAMはそれ単体で完結するのは強い apexはterraformからインフラを管理するか ら整合性を取りやすい 今回はapexが向いていた (既存インフラ管理がterraformだったため)
  44. 気をつけること - インフラ構築とlambda本体のデプロイの順番を考 慮する必要がある

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

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

  47. IAM role と lambda の場合 - 初手 `apex deploy` Lambda実行用の

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

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

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

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

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

    infra apply` から始める lambdaがまだ存在しないのでCloudWatch Eventが 作れなくてエラー
  53. 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`
  54. 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` 成功
  55. 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` 成功 つら
  56. 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` だけでいい
  57. 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の嬉しい部分と 天秤にかけて、 採用するか決めると良さそう
  58. 具体的なコードについて - 量の関係で省略します - この記事が参考になると思います(少し古いです が) https://dev.classmethod.jp/cloud/aws/ami-and- snapshot-delete-with-apex-and-terraform/

  59. もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda

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

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

    ここに載ってました https://docs.aws.amazon.com/ja_jp/athen a/latest/ug/cross-account-permissions.htm l
  62. 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書いたので よければ参考にしてください
  63. 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
  64. パーティション発行スクリプトのパス指定ミス - Lambda発行スクリプトはGoで書いてた - 月の取得を time.Time.Month() でやってた - time.Time.Month() はゼロパディングなしの現在の

    月を取得する関数(1とか12とか) - LBはYYYY/MM/DDでパスを掘る
  65. ようするにこういうクエリを発行してしまった

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

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

    るとconst定義されてます
  68. 対策 - 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
  69. もくじ - 自己紹介 - Athenaとは - Athenaのパーティションとは - なぜ Lambda

    + CloudWatch Event か - apexでの構築 - はまったところ - まとめ
  70. まとめ - apex, dry-runとか環境分けたりとかlocal実行とかで きて便利 - インフラ構成も考慮に入れると手順がだるい - Lambdaのサイズ間によっては直接terraformで書 いた方が楽かも

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

    - Athenaを叩く実行ロールはS3周りがだるいので覚 えておくと楽 - 初歩的ですがYYYY/MM/DDには気をつけてくださ い みなさんもよきLambdaライフを!
  72. - プレゼンテーションテーマは SlidesCarnival の ヨークプレゼンテーションテンプレー ト を利用しています クレジット表記

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