kakakakakku blog

Weekly Tech Blog: Keep on Learning!

CloudWatch で ELB の「パーセンタイル統計」を可視化しよう

今日は CloudWatch の話を書こうと思う.既に活用してる人も多いと思うけど,2016年11月の新機能リリースで各種メトリクスの「パーセンタイル統計」を可視化できるようになった.

「パーセンタイル統計」は凄く重要で,平均値だけをモニタリングしていると気付きにくい異常値に気付くことができる.例えば,ELB の Latency をモニタリングしている場合に,リクエストの 1% が非常にパフォーマンスが悪いとしても,平均値で見ると値が丸まってしまって,通常より少し遅い程度にしか見えないという場合がある.そんなときに「パーセンタイル統計」を活用できる.

まだ全ての ELB に反映されていない

以下の記事を読むと,newly created ELB and ALB と書かれていて,新機能リリース以降に作成した ELB と ALB にしか対応していないように読み取れた.

Percentiles are supported for EC2, RDS, and Kinesis as well as for newly created Elastic Load Balancers and Application Load Balancers.

また別の記事を読むと,既に運用している ELB と ALB は will be available in the coming weeks であると書いてあった.ただし,数週間待っても反映されず,年を越してしまった.

Percentile metrics are available today for all new Application Load Balancers and can be accessed from the CloudWatch console, SDK and API. Support for existing Application Load Balancers and all Classic Load Balancers will be available in the coming weeks.

今週やっと ELB で「パーセンタイル統計」を可視化できるようになった

実は「パーセンタイル統計」が反映されたらすぐに気付けるように,以前から CloudWatch Dashboard にグラフを追加していたので,1/24 に「あ!反映された!」とすぐに気付くことができた(笑)

既に反映された ELB もあるし,まだ反映されてない ELB もある.リソースを作成した時期にもよりそう.

以下の例では,3種類の「パーセンタイル統計」を可視化している.特に p99 の値を見ると,異常値が検出できていることがわかる.

  • Latency p99
  • Latency p95
  • Latency p90

f:id:kakku22:20170127194516j:plain

グラフを作る Tips

ちなみに,グラフを作るときに「メトリクス追加」のようなボタンが無くて,どうやったら複数の「パーセンタイル統計」を表示できるのか全然わからなかった.適当にポチポチしてたら,右側にコピーアイコンがあることに気付いたけど,これは気付かないでしょう!ということで Tips も載せておく.

f:id:kakku22:20170127195918j:plain

まとめ

既に「パーセンタイル統計」が反映されている ELB と ALB も多そうなので,CloudWatch Dashboard で可視化しておくと,異常値に気付くことができて便利!

最近は Grafana が最高すぎるから,CloudWatch のダッシュボードも Grafana に移行しようと思ってる.

kakakakakku.hatenablog.com

AWS Well-Architected Framework に5本目の柱 "Operational Excellence" が追加されていた

AWS を運用しているエンジニアなら読んだ人も多いであろう,2015年10月に公開された "AWS Well-Architected Framework" に実は大幅なアップデートが入っていることに気付いた.時期的には AWS re:Invent 2016 の直前で,AWS re:Invent 2016 で発表された新サービスを見越していたんだろうと推測できる.

アップデート内容としては大きく2個ある.

  • 今までの4本の柱のベストプラクティスが一部見直された
  • 新たに5本目の柱 "Operational Excellence" が追加された

今回アップデートされた "AWS Well-Architected Framework" を理解するために活用した「AWS Well-Architected 研修」を紹介しつつ,実際に "Operational Excellence" を読んでみた感想をまとめておこうと思う.

無料で受講できる「AWS Well-Architected 研修」

以下のページにある "Training" からリンクを辿ると「AWS Well-Architected 研修」を受講することができる.しかも無料.ちゃんと "Operational Excellence" も含まれていて,最新版の "AWS Well-Architected Framework" に準拠した内容になっていた.

aws.amazon.com

カリキュラム

カリキュラムは6個あり,"AWS Well-Architected Framework" の全体概要を学ぶカリキュラムと,柱ごとの概要を学ぶカリキュラムがある.

  • AWS Well-Architected - Module 1: The AWS Well-Architected Framework
  • AWS Well-Architected - Module 2: The Security Pillar
  • AWS Well-Architected - Module 3: The Reliability Pillar
  • AWS Well-Architected - Module 4: The Performance Efficiency Pillar
  • AWS Well-Architected - Module 5: The Cost Optimization Pillar
  • AWS Well-Architected - Module 6: The Operational Excellence Pillar

全体的に良いなと感じたのは以下の3点だった.AWS 初学者にもオススメできる.

  • 動画内に Knowledge Check があって理解度確認をしながら進められること
  • 関連資料のリンクも多く紹介されていること
  • オンプレ環境など従来の環境とクラウドネイティブな環境の比較を学べること

学んだこと

  • "一般的な設計の原則" に "Improve through game days" が新たに追加されていた
    • 本番環境と同等なリクエストでアーキテクチャをテストすることによって改善に役立てるべき(これを "Game Days" と表現している)
    • "Game Day" は AWS 主催のトラブルシューティングコンテストのようなもの(ISUCON 的な)
  • "パフォーマンス効率の柱" に "Mechanical sympathy" が新たに追加されていた
    • 処理特性などを考えて,達成したいことに最適な技術を選択するべきということ
  • "コストの最適化の柱" の Key AWS Services(最も重要なサービスのこと)が "コスト配分タグ" だった
    • 知らなかった...

認定証

f:id:kakku22:20170110020944p:plain

"Operational Excellence" を読んでみた

まだ日本語訳になった資料は公開されていないが,"Operational Excellence" は "運用上の優秀性" と訳されていた."Operational Excellence" をザッと読んでみた.あくまで個人的なコメントなので,是非実際に PDF を読んで頂きたい!

設計の原則

  • Perform operations with code
    • インフラ運用をコード化しよう!
  • Align operations processes to business objectives
    • ビジネス目標に合わせた運用プロセスにしよう!
  • Make regular, small, incremental changes
    • 定期的に/小さく/段階的に変更しよう!サービスのダウンタイムを取らないように運用手順を考えよう!
  • Test for responses to unexpected events
    • 障害など予期しないイベントに備えてテストしよう!
  • Learn from operational events and failures
    • 失敗から学んで運用をさらに良くしよう!
  • Keep operations procedures current
    • 運用手順書や障害対応手順書を更新し続けよう!

ベストプラクティス(質問集)

OPS 1. What best practices for cloud operations are you using?

  • Operational Checklist
  • Proactive Plan
  • Security Checklist

チェックリストを作って確認できるプロセスにすることは確かに重要だなと思った.2013年から更新されていない点は気になるけど,AWS から公式に "Operational Checklists for AWS" が公開されていて,"AWS Well-Architected Framework" と似たような観点で確認するべきチェックリストが用意されている.

またビジネス的にインパクトのあるキャンペーンを実施するときなどは事前に計画して運用時に考慮するべきと書かれている.僕が担当してるシステムだと,テレビ砲や Yahoo! 砲が予定されているときは事前に共有をもらうようにしている.

OPS 2. How are you doing configuration management for your workload?

  • Resource Tracking
  • Documentation
  • Capture Operational Learnings
  • Immutable Infrastructure
  • Automated Change Procedures
  • Configuration Management Database (CMDB)

一言で言うと Infrastructure as Code を目指そうという内容だった.ドキュメント化(コード化)して,GitHub などで管理して,反映も自動化することが重要と書かれている.

OPS 3. How are you evolving your workload while minimizing the impact of change?

  • Deployment Pipeline
  • Release Management Process
  • Small Incremental Changes
  • Revertible Changes
  • Risk Mitigation Strategies

リリースの影響を小さくするために,デプロイフロー(継続的インテグレーション/継続的デリバリー)を整えたり,リリース戦略(Blue/Green デプロイメント/カナリアリリース/AB テスト)を適用したりするべきと書かれていた.特に "Revertible Changes" は実現できていないところもあって考えてみたい.ロールバックだけではなく,フィーチャートグルにも言及されていたのは良かった.

OPS 4. How do you monitor your workload to ensure it is operating as expected?

  • Monitoring
  • Aggregate Logs
  • Alarm-Based Notifications
  • Trigger-Based Actions

内部的な要因や外部的な要因で障害は発生してしまうため,適切にモニタリングして,異常値であればアラートを飛ばしたり,自動的にアクションを実施したりするべきと書かれていた.

OPS 5. How do you respond to unplanned operational events?

  • Playbook
  • RCA Process
  • Automated Response

障害が発生したときにどのように対応するかという話だった.Playbook の適切な日本語訳がわからないけど,オンコールプロセスを用意したり,障害の影響度に応じて組織内でエスカレーションしていくプロセスを決めておくなどが例として挙がっていた."Automated Response" も今後は考えたい.自動化できる対応は自動化して運用を楽にするべき.

OPS 6. How is escalation managed when responding to unplanned operational events?

  • Appropriately Document and Provision
  • Functional Escalation with Queue-based Approach
  • Hierarchical Escalation
  • External Escalation Path
  • Hierarchical Priority Escalation is Automated

OPS 5. と関連していて,エスカレーションをどのように管理するかという話だった.組織内でエスカレーションしていくプロセスを決めておくだけではなく,AWS サポートや外部サービスのサポートなど,影響する可能性のあるパートナーのエスカレーションパスも事前に用意しておくという話は参考になった.

Achieving Agility by Following Well-Architected Framework Principles (ARC203)

AWS re:Invent 2016 で "AWS Well-Architected Framework" に関するセッションがあった.

www.youtube.com

まとめ

  • 2016年11月に "AWS Well-Architected Framework" が大幅にアップデートされていた
  • 無料で受けられる「AWS Well-Architected 研修」があった
  • 5本目の柱 "Operational Excellence" を読むと,システムを安定稼働させるためのベストプラクティスと,障害時に迅速に対応するためのベストプラクティスが学べた

関連記事

kakakakakku.hatenablog.com

Amazon Athena で「郵便番号データ(CSV 形式)」を検索する

AWS re:Invent 2016 で発表されてからもう1ヶ月も過ぎてしまったけど,今さらながら Amazon Athena を実際に試してみた.検証記事は既に多く出てて,積極的に読んでいたけど,実際に動かしてみようと思った.

現在まだ東京リージョンには対応して無く,今回はバージニアリージョンを使った.ただし,S3 をバックエンドにする場合,リージョンが異なっていてもアクセスできるため,問題なく使えた.

aws.amazon.com

サンプルテーブル elb_logs

Athena のチュートリアル用に ELB アクセスログのサンプルデータが入った elb_logs が用意されていて,すぐに Athena を試すことができる.最初に試して雰囲気を感じることができた.既に多くの人が試しているし,今回は割愛する.さっそく独自データを用意して Athena を試してみた!

検証 : 郵便番号データを検索する

1. データセット

今回 Athena を試すときに以下の条件に合致するデータセットを探していた.Athena は大量データを対象にしてもパーティショニング設定をすることによってスキャン範囲を限定して軽量に動くけど,今回は試行錯誤することも考えて,フルスキャン可能な小さなデータ量にしたいと考えた.

  • CSV 形式でダウンロードできること
  • 複数ファイルになっていること
  • フルスキャンしても Athena 破産しないデータ量に収まっていること

結果的に日本郵政が公式に提供している「郵便番号データ(読み仮名データの促音・拗音を小書きで表記するもの)」が,全ての条件をクリアしていた.

  • CSV を ZIP にしている
  • 都道府県別データと全国一括データを選択できる
  • 全国一括データの CSV も 12MB 程度

www.post.japanpost.jp

2. データ変換 & データアップロード

都道府県別データ47個をダウンロードした後に以下の変換をする.

# ZIP → CSV に展開する(データ変換をするため & Athena は ZIP をサポートしていないため)
$ find . -name "*.zip" | xargs -n 1 unzip
# ZIP を削除する
$ rm *.zip
# SJIS → UTF-8 に文字コードを変換する
$ find . -name "*.CSV" | xargs -n 1 nkf -w --overwrite
# " を除去する(Mac で実行するため sed は BSD 互換になっている)
$ find . -name "*.CSV" | xargs -n 1 sed -i '' 's/\"//g'
# 半角スペースを除去する(Mac で実行するため sed は BSD 互換になっている)
$ find . -name "*.CSV" | xargs -n 1 sed -i '' 's/ //g'
# CSV → GZ に圧縮する
$ find . -name "*.CSV" | xargs -n 1 gzip

最終的に .CSV.gz ファイルが47個用意できた.

$ ls -1 *.CSV.gz | wc -l
      47

S3 にアップロードする.今回はバケット直下に zipcodes ディレクトリを用意して,そこに置いた.

f:id:kakku22:20161230084932p:plain

3. テーブル作成

S3 にデータを準備したら,次は Athena 側にテーブルを作成する.

  • データベースは sampledb を使う
  • テーブル名は zipcodes とする
  • 配置した S3 パスを指定する(末尾の / を忘れずに!)
    • s3://xxx/zipcodes/

f:id:kakku22:20161230083735p:plain

次にデータフォーマットとして CSV を選択する.JSON も選べるんだ!

f:id:kakku22:20161230085223p:plain

次にカラム定義を設定する.CSV を1行 READ して必要なカラム数を最初から表示してくれる...的なアシストは無くて,地道に Add a column を押した.全てのカラムを定義する必要はなく,今回は9カラムを定義することにした(日本郵政の README に書かれている通り,実際には計15カラム存在する).

www.post.japanpost.jp

No. データ概要 データフォーマット Athena カラム名 Athena データタイプ
1 全国地方公共団体コード 半角数字 gov_code int
2 (旧)郵便番号(5桁) 半角数字 old_zipcode int
3 郵便番号(7桁) 半角数字 zipcode int
4 都道府県名 半角カタカナ prefecture_kana string
5 市区町村名 半角カタカナ city_kan string
6 町域名 半角カタカナ address_kana string
7 都道府県名 漢字 prefecture_char string
8 市区町村名 漢字 city_char string
9 町域名 漢字 address_char string

f:id:kakku22:20161230085420p:plain

パーティショニング設定はスキップした.アクセスログなど日付別にディレクトリが分割されているデータセットを扱う場合には必須の設定になりそう.

最終的に以下のクエリが自動的に生成されて,テーブルが作成できた.

CREATE EXTERNAL TABLE IF NOT EXISTS sampledb.zipcodes (
  `gov_code` int,
  `old_zipcode` int,
  `zipcode` int,
  `prefecture_kana` string,
  `city_kana` string,
  `address_kana` string,
  `prefecture_char` string,
  `city_char` string,
  `address_char` string 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
) LOCATION 's3://xxx/zipcodes/';

4. クエリ実行

SQL ライクに実行することができた.試しにオフィス(渋谷マークシティ)の郵便番号を検索してみた.

f:id:kakku22:20161230091817p:plain

GROUP BY も書ける.

f:id:kakku22:20161230100103p:plain

Athena 便利だ!

ハマった点

郵便番号検索を動かすまでに数回ハマった点がある.全て「2. データ変換」に反映してあるけど,簡単に残しておく.結論として Athena を使う場合,データセットの事前準備が重要になる.

1. SJIS

SJIS と知らずに Athena でクエリを投げたら完全に文字化けをしてしまった.nkf で変換して対応した.

f:id:kakku22:20161230110422p:plain

2. ダブルクオート

郵便番号データは以下のように文字列を " で囲っていた.Athena では除去されずに取り込まれてしまうため,事前に sed で除去した.ちなみに int で定義されているのに " で囲まれているカラムもあって謎だった.

01101,"064  ","0640941","ホッカイドウ","サッポロシチュウオウク","アサヒガオカ","北海道","札幌市中央区","旭ケ丘",0,0,1,0,0,0

f:id:kakku22:20161230110535p:plain

3. 半角スペース

2カラム目にある「旧郵便番号」は「3桁」と「5桁」の場合があった.「3桁」の場合に半角スペースが2個付いていて,int なのに文字数を合わせているデータ構造になっていた.Athena で取り込むと int ではないため,値が全て飛んでしまって,ブランクになってしまった.よって,同じく sed でブランクを除去した.

01101,"064  ","0640941","ホッカイドウ","サッポロシチュウオウク","アサヒガオカ","北海道","札幌市中央区","旭ケ丘",0,0,1,0,0,0
01106,"06122","0612261","ホッカイドウ","サッポロシミナミク","ミスマイ1ジョウ","北海道","札幌市南区","簾舞一条",0,0,1,0,0,0

f:id:kakku22:20161230111008p:plain

今後 Athena を活用したいところ & まとめ

現在 AWS のサービスログで,直接 S3 からログをダウンロードして分析したり,Elasticsearch に突っ込んで分析したりしている場合がある.

  • ELB アクセスログ
  • CloudFront アクセスログ
  • VPC フローログ
  • CloudTrail ログ

アドホックに実行するための準備が面倒だなと感じていたため,今後は Athena を使おうと思う.ただし,パーティショニング設定は理解して使う必要があるから別途仕様を整理する.ただまぁ,1TB / $5 だからそう簡単に課金されないと思う.

またアドホックに実行するとしても,頻繁に使うにしては GUI が厳しいかもと思ってたら,先週のアップデートで QuickSight と連携したみたいだし,Redash 連携もできそうだし,Athena をバックエンドとして使う形が一般的になる気がする.

今まで AWS のサービスログに対してアドホックに分析する環境を作って無く,運用上のボトルネックに感じていたため,Athena 最高!という感じ.積極的に使うぞ!

年賀状を送るときに(笑)

タイミング良く年賀状の時期!もし年賀状を送るときに郵便番号がわからなかったら Athena で検索すれば調べられる!最高に便利だ(笑)

(素直に公式サービスを使おう!)

www.post.japanpost.jp

関連記事

elb_logs テーブルで Athena を試したり,独自データを検索するなど,基本的な操作を学ぶときに参考になった.

dev.classmethod.jp

Athena リリース直後にすぐ出た BigQuery との比較記事で「おー,Athena 凄そう」と感じることができた記事だった.

data.gunosy.io

導入しようと考えている CloudFront アクセスログの検索だった.スキーマを用意してもらっててすぐに試せそう.

blog.manabusakai.com

ログ構造的に CloudTrail ログの検索は難しそうだった.

dev.classmethod.jp

Athena のベースになっている Presto も勉強して,Presto の特性を理解しておくと良さそうだなと感じた.

repeatedly.github.io

Amazon Elasticsearch Service を運用して学んだこと

「Amazon Web Services Advent Calendar 2016」20日目の記事を書くぞー!

最近 Amazon Elasticsearch Service を本番環境で運用していて,そこそこに運用経験がまとまったので,どこかで LT でもしようと思って先に発表資料だけを作っていたんだけど,年内に発表できそうな勉強会が無くて,このままにしておくのも残念だなと思って,今回 Advent Calendar に資料を公開する形で参加することにした.もし良さそうな勉強会があれば発表したいので是非教えてもらえると!

qiita.com

Amazon Elasticsearch Service を運用して学んだこと

まとめ

正直言ってハマるポイントも多くある Amazon Elasticsearch Service だけど,Elasticsearch クラスタの運用をフルマネージドにできるメリットは大きいし,インスタンスタイプも柔軟に選べるし,Elasticsearch クラスタの運用に悩んでいるなら移行を検討しても良いと思う.ただ今回は全文検索エンジンなど高負荷に Elasticsearch を使うユースケースではないため,その場合はまた別のポイントでハマる可能性はあると思う.

資料は結構頑張って作ったので,誰かの参考になれば嬉しい!!!

関連記事

資料に載せた「学んだこと」の多くは既にブログにまとめてある.合わせてどうぞ!

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

Amazon Elasticsearch Service で「手動スナップショット」を取得する

自動スナップショットと手動スナップショット

Amazon Elasticsearch Service でクラスタのスナップショットを取得する場合,「自動スナップショット」と「手動スナップショット」の2種類がある.

AWS 側で自動的に日次取得してくれるものを「自動スナップショット」と呼ぶ.14世代保管される.ただし「自動スナップショット」のリストアは自分たちではできず,AWS サポートに依頼して実施してもらう必要がある.よって,リストアのタイミングが AWS サポート側に依存することになり,運用的には自由度が低いものとなる.

逆に「手動スナップショット」は,Elasticsearch 自体のスナップショット機能を使って,任意のタイミングでスナップショットの取得とリストアができるため,自由度が高いものとなる.また EC2 上で運用している Elasticsearch クラスタのスナップショットを取得して,Amazon Elasticsearch Service にリストアすることで,移行としても使える.

詳しくはドキュメントに記載されているが,日本語訳が変で「スナップショットを取る」と「スナップショットを取得する」と訳すべきところが「スナップショットを撮る」と「スナップショットを撮影する」になっていて,どうしても読みながら気になってしまった.フィードバックしたら修正してもらえるのかな?

docs.aws.amazon.com

www.elastic.co

手動スナップショットを試してみた

最近 Amazon Elasticsearch Service で運用しているクラスタが落ちたことがあって,AWS サポートに依頼して「自動スナップショット」からのリストアをお願いした.そのときに「手動スナップショットはしてますか?」や「手動スナップショットがあるとリストアも素早くできますよ」的なコミュニケーションがあって,AWS 的にも自由度が高い「手動スナップショット」を推奨しているのかなという雰囲気を感じて,一度試してみようと思った.

前提

  • Amazon Elasticsearch Service ドメイン(クラスタ)が構築済であること
  • エンドポイントは全て ${amazon_es_endpoint} で記載している

事前準備(ドキュメントを登録する)

事前にサンプルドキュメントを1件登録する.

$ curl -s -XPUT ${amazon_es_endpoint}/blog/articles/1 -d '
quote> {
quote>   "title": "xxx",
quote>   "body": "yyy",
quote>   "tags": ["z1", "z2"]
quote> }
quote> '
{"_index":"blog","_type":"articles","_id":"1","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true}%

$ curl -s ${amazon_es_endpoint}/blog/articles/1 | jq .
{
  "_index": "blog",
  "_type": "articles",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "title": "xxx",
    "body": "yyy",
    "tags": [
      "z1",
      "z2"
    ]
  }
}

IAM 設定をする

スナップショットを S3 に保存するため,IAM で少し複雑な設定をする必要がある.詳しくは上に載せたドキュメントに書いてあるので,ここでは箇条書きに留めておく.

  • スナップショットを保存する S3 に対するアクセス許可をした IAM ポリシーを作成する
  • ロールタイプを EC2 にした IAM ロールを作成し,Amazon Elasticsearch Service に対する権限と作成した IAM ポリシーをアタッチする

リポジトリ登録をする

Amazon Elasticsearch Service で手動スナップショットを取得する場合,S3 に保存することになるが,事前に S3 をスナップショットのリポジトリとして登録する必要がある.さらに登録するときに AWS のリクエスト署名が必要になるため,curl から API を叩くことができず,SDK を経由する必要がある.今回はドキュメントに書いてある Python (boto) のサンプルコードを使った.これは面倒すぎる...!

実際に実行するときは以下の項目を書き換える必要がある.

  • region
  • host
  • aws_access_key_id
  • aws_secret_access_key
  • path
  • bucket
  • role_arn
from boto.connection import AWSAuthConnection

class ESConnection(AWSAuthConnection):

    def __init__(self, region, **kwargs):
        super(ESConnection, self).__init__(**kwargs)
        self._set_auth_region_name(region)
        self._set_auth_service_name("es")

    def _required_auth_capability(self):
        return ['hmac-v4']

if __name__ == "__main__":

    client = ESConnection(
            region='us-east-1',
            host='search-weblogs-etrt4mbbu254nsfupy6oiytuz4.us-east-1.es.a9.com',
            aws_access_key_id='my-access-key-id',
            aws_secret_access_key='my-access-key', is_secure=False)

    print 'Registering Snapshot Repository'
    resp = client.make_request(method='POST',
            path='/_snapshot/weblogs-index-backups',
            data='{"type": "s3","settings": { "bucket": "es-index-backups","region": "us-east-1","role_arn": "arn:aws:iam::123456789012:role/MyElasticsearchRole"}}')
    body = resp.read()
    print body

実行したところ,以下のような結果が返ってきた.

$ python snapshot.py
Registering Snapshot Repository
{"acknowledged":true}

手動スナップショットを取得する

これで,やっと準備が整ったので,手動スナップショットの取得ができる.取得自体は簡単で,以下の API をコールする.今回は2回スナップショットを取得してみた.

$ curl -XPUT ${amazon_es_endpoint}/_snapshot/backups/snapshot_1
{"accepted":true}%

$ curl -XPUT ${amazon_es_endpoint}/_snapshot/backups/snapshot_2
{"accepted":true}%

取得後にスナップショットの一覧を確認することもできる.

$ curl -s ${amazon_es_endpoint}/_snapshot/backups/_all | jq .
{
  "snapshots": [
    {
      "snapshot": "snapshot_1",
      "version_id": 2030299,
      "version": "2.3.2",
      "indices": [
        "blog"
      ],
      "state": "SUCCESS",
      "start_time": "2016-12-17T08:03:25.067Z",
      "start_time_in_millis": 1481961805067,
      "end_time": "2016-12-17T08:03:26.174Z",
      "end_time_in_millis": 1481961806174,
      "duration_in_millis": 1107,
      "failures": [],
      "shards": {
        "total": 1,
        "failed": 0,
        "successful": 1
      }
    },
    {
      "snapshot": "snapshot_2",
      "version_id": 2030299,
      "version": "2.3.2",
      "indices": [
        "blog"
      ],
      "state": "SUCCESS",
      "start_time": "2016-12-17T08:07:18.741Z",
      "start_time_in_millis": 1481962038741,
      "end_time": "2016-12-17T08:07:19.207Z",
      "end_time_in_millis": 1481962039207,
      "duration_in_millis": 466,
      "failures": [],
      "shards": {
        "total": 1,
        "failed": 0,
        "successful": 1
      }
    }
  ]
}

S3 でもスナップショットが取得されていることを確認できた(S3 は新 UI に変更済).

f:id:kakku22:20161217180035p:plain

手動スナップショットをリストアする

次にリストアを試す.1点注意点があって,Amazon Elasticsearch Service は _close API をサポートしていないため,リストアするインデックスを事前に削除した状態でないとリストアできないという制約がある.まず最初に,インデックスが存在する状態でリストアをしてみたところ,以下のように 500 が返ってきた.

$ curl -s -XPOST ${amazon_es_endpoint}/_snapshot/backups/snapshot_1/_restore | jq .
{
  "error": {
    "root_cause": [
      {
        "type": "snapshot_restore_exception",
        "reason": "[backups:snapshot_1] cannot restore index [blog] because it's open"
      }
    ],
    "type": "snapshot_restore_exception",
    "reason": "[backups:snapshot_1] cannot restore index [blog] because it's open"
  },
  "status": 500
}

よって,インデックスを削除して,ドキュメントがクエリできないことを確認した.

$ curl -XDELETE ${amazon_es_endpoint}/_all
{"acknowledged":true}%

$ curl -s ${amazon_es_endpoint}/blog/articles/1 | jq .
{
  "error": {
    "root_cause": [
      {
        "type": "index_not_found_exception",
        "reason": "no such index",
        "resource.type": "index_expression",
        "resource.id": "blog",
        "index": "blog"
      }
    ],
    "type": "index_not_found_exception",
    "reason": "no such index",
    "resource.type": "index_expression",
    "resource.id": "blog",
    "index": "blog"
  },
  "status": 404
}

改めてリストアすると,成功して,ドキュメントもクエリできた.

$ curl -s -XPOST ${amazon_es_endpoint}/_snapshot/backups/snapshot_1/_restore | jq .
{"accepted": true}

$ curl -s ${amazon_es_endpoint}/blog/articles/1 | jq .
{
  "_index": "blog",
  "_type": "articles",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "title": "xxx",
    "body": "yyy",
    "tags": [
      "z1",
      "z2"
    ]
  }
}

まとめ

クラスタの運用を考えると Amazon Elasticsearch Service の「手動スナップショット」は重要で,今回一通りの手順を試してみた.

感想としては「面倒な部分が多いな...」という印象で,管理コンソールと API 経由でもっと簡単にスナップショットを管理したいし,S3 のリポジトリ登録も管理コンソールと API 経由で行いたいし,もっと言うと「自動スナップショット」を AWS サポートに依頼せずともリストアできたら便利なんだけどなーとも思う.今後のアップデートに期待する!