AWS

データレイクハンズオン~ニアリアルタイムデータ分析環境(スピードレイヤ)~構築してみた

はじめに

データの収集・保存・変換・分析をおこなうデータレイクはAIや機械学習に限らず様々な分野で活用されていますが、実際AWS環境でデータレイクをどのようにおこなっていったら良いかわからないことがあるかと思います。

今回は、AWS日本語ハンズオンで公開されている「データレイクハンズオン」を通して、ニアリアルタイム(リアルタイム処理に近いが即時応答が不要で、要求受付のみ即時に行う必要システム)データ分析環境をハンズオンに従って実際にやってみます。

本記事を通して、ハンズオンの雰囲気やこれからハンズオンに挑戦される方の参考になれば幸いです。

実施するハンズオン元は以下になります。

3パターン体験することができますが、その内の1パターンをおこなう形とします。

データレイクの概要は以下、過去記事に記載されておりますのでそちらも合わせてご確認ください。

AWS構成図イメージ

ハンズオン資料の「README.md」から引用させていただいております。

Lab1 ~ 6まででハンズオン全体が構成されておりますが、今回実施するパターンでは、Lab1 ~ 3までをおこなっていくことになります。

Lab1でデータ収集元となるEC2環境にログ収集ソフトFluentdを入れ、アプリケーションからのログを送信できる環境を構築します。

Lab2でアプリケーションログをリアルタイムに可視化する環境を構築し、Lab3でCloudWatchおよびLambdaを挟み込んでアラームを検知できる仕組みを構築します。

それでは、実際にハンズオンを実施していきます。

※Lab3:アプリケーションログのリアルタイム可視化とアラームについてはブログ記事が予想以上に長くなってしまいましたので、またの機会にブログを執筆します。

Lab1:はじめの準備

EC2キーペア作成

EC2を構築するため、環境に入るキーペアを作成します。

  • AWSマネージメントコンソールにログインし、右上が東京になっていることを確認します。
  • 検索アイコンにEC2といれ、EC2が一覧に出てくるのでクリックします。
  • 以下、キャプチャ画像、「キーペア」を選択し、「キーペアを作成」ボタンを押します。

  • 名前欄に適当な名前、ここでは「handson」と入力します。
  • TeraTermからssh接続をおこなう場合等で、EC2にアクセスする際に使用しますので「.pem」にチェックを入れ、「キーペアを作成」をクリックします。

作成完了すると、「handson.pem」という名前のキーペアがダウンロードされますので、分かりやすい場所に保存しておきます。

EC2環境をCloudFormationで作成

ログが2分おきに10件前後出力され、10分おきに300件のエラーログが流れるアプリが動作します。

ログ収集ソフトウェア「Fluentd」がインストール済の環境ができあがります。

「AWS Systems Manager Session Manager」から接続する権限も自動的に割当たるため、SSMを経由して、EC2にアクセスすることも可能になります。

ハンズオン資料より「1-minilake_ec2.yaml」が提供されておりますのでこちらのCloudFomationテンプレートを使用します。

※リンク先、ダウンロードアイコンをクリックすることでダウンロード可能です。

  • AWSマネージメントコンソールより検索アイコンに「CloudFormation」と入力し、一覧にでてくる「CloudFormation」をクリックします。
  • 以下、キャプチャ画像の通り、スタックの作成プルダウンメニューより「新しいリソースを使用 (標準)」を選択します。

スタックの作成

  • テンプレートの指定よりテンプレートファイルのアップロードにチェックを入れます。
  • ファイルを選択ボタンクリック後、先ほどダウンロードした「1-minilake_ec2.yaml」を選びアップロードします。
  • 次へをクリックします。

スタックの詳細を設定

  • スタック名に「handson-minilake」と任意の名前を入力します。
  • パラメータ項目、KeyPairプルダウンメニューより冒頭で作成したキーペア名「handson」を選択します。
  • RoleName項目に「handson-minilake-role」と任意の名前を入力します。
    • ロール名はこちらで指定した名前で作成され、SSM関連の権限がEC2インスタンスに割り当たります。
  • 次へをクリックします。

スタックオプションの設定

  • タグ項目、キーへ「Name」と入力し、「値」へ「handson-minilake」任意の値を入力します。
  • その他の項目は触らずに「次へ」をクリックします。

レビュー handson-minilake

  • 今まで設定してきた内容の確認をおこないます。
  • 1番下までスクロールし、「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」へチェックを入れます。
  • 内容に問題ないことを確認し、送信をクリックします。

  • その後、CloudFormationによって、EC2、IAMロール、VPC、セキュリティグループ等が自動構築されます。
  • スタックの情報タブよりステータスが「CREATE_COMPLETE」になるまで暫く待ちます。

SSM経由でEC2インスタンスに接続

作成したEC2インスタンスに入りログが出ていることを確認しますのでSSM経由で確認してみます。

  • マネージメントコンソール、検索アイコンに「ssm」と入れ、「Systems Manager」をクリックします。
  • ノード管理プルダウンメニューより「セッションマネージャー」を選択します。
  • セッションの開始ボタンをクリックします。

Specify target

  • 「Reason for session – optional」項目に「handson-minilake-session-{YYYYMMDDHHMM}」任意の値を入力します。
  • 「handson-minilake」が一覧に出てくるのでチェックを入れます。
    • キャプチャ画像中では、選択されていない状態となっていますが、実際はチェックを入れ、選択するとチェック箇所周囲が青い状態で囲まれます。
  • 「Start session」ボタンをクリックします。

EC2ログ確認

セッション開始後対象のEC2インスタンスにログインした状態となります。
以下コマンドを実行し、ログ確認をおこないます。

  • # sudo su -
  • # tail -f /root/es-demo/testapp.log

※実行される際は先頭 # を外した状態でおこなってください。

確認結果が以下キャプチャ画像となります。

ここまででLab1の内容が完了となります。

ログ出力されていることを確認できれば、終了ボタンをクリックし、セッションを終了していただいて問題ありません。

Lab1で以下内容を実施しました。

  • 2分おきに10件前後のログを出力し、10分おきに300件のエラーログを出力し続ける EC2を構築しました。
  • EC2インスタンスにSSMから接続可能なIAMロール権限を割り当てました。
  • 構築したEC2に、ログ収集ソフトウェアの Fluentd をインストールしました。

Lab2:アプリケーションログをリアルタイムで可視化

Fluentdから送信されるログストリームをリアルタイムに可視化するため、Amazon OpenSearch Serviceを使用し、付属しているOpenSearch Dashboards上でグラフフィカルに可視化します。

  • AWSマネージメントコンソールの検索欄に「OpenSearch Service」と入力し一覧にでてきます「Amazon OpenSearch Service」をクリックします。
  • 右上にある「ドメインの作成」ボタンをクリックします。

ドメインの作成

  • 名前項目、ドメイン欄に「handson-minilake」任意の値を入力します。
  • ドメインの作成方法項目より標準作成をクリックします。
  • テンプレート項目より開発/テストをクリックします。
  • デプロイオプションより以下をそれぞれ選択します。
    デプロイオプション アベイラビリティーゾーン
    スタンバイが無効のドメイン 1-AZ
  • エンジンオプション項目、バージョンは「1.0」を選択します。
    • 執筆時点最新、2.9で試したところ、データ送信がうまくいかなかったので、ハンズオン当時のバーチョン1.0でおこなっております。
  • データノードより以下をそれぞれ選択します。

    インスタンスタイプ ノードの数
    t3.small.search 1
    • ※データノード設定項目は上記以外変更しません。
  • ネットワーク項目、ネットワークは パブリックアクセス にチェックを入れます。
  • きめ細かなアクセスコントロール項目より「きめ細かなアクセスコントロールを有効化」にチェックが入っていることを確認します。
  • きめ細かなアクセスコントロールよりマスターユーザーの作成にチェックを入れ、それぞれ以下設定をおこないます。

    マスターユーザー名 マスターパスワード
    aesadmin MyPassword&1
    • マスターパスワードの確認にマスターパスワードと同一の値を入力します。
    • ※マスターユーザー名、マスターパスワードは任意の値で問題ありません。
  • アクセスポリシー項目よりドメインレベルのアクセスポリシーの設定にチェックを入れます。
  • アクセスポリシー、要素項目プルダウンメニューより「ソース IP アドレス」を選びます。
  • アクセスポリシー、プリンシパル項目へ「 ご自身のIPアドレス 」を入力後、アクション項目より「許可」を選択します。
  • アクセスポリシー、要素項目より新しい要素の追加をクリックし、先ほどと同様、「ソース IP アドレス」、アクション項目より「許可」を選択後、プリンシパル項目へ Lab1で作成したインスタンスのパブリックIP を入れます。
    • Lab1でSSMよりEC2へアクセスしました再度、アクセスし、「 # curl http://checkip.amazonaws.com/ 」とタイプすることで、EC2インスタンスのパブリックIPアドレスを取得出来ます。
    • ※実行される際は先頭の # を外してください。
  • アクセスポリシー、要素項目より新しい要素の追加をクリックし、タイプに [IAM ARN] を選択後、プリンシパルに「 ご自身のAWSアカウントID 」を入力し、アクションより [許可] を選択します。
    • Lab1でSSMよりEC2へアクセスしました再度、アクセスし、「 # aws sts get-caller-identity --query Account --output text 」とタイプすることで、AWSアカウントIDを取得出来ます。
    • ※実行される際は先頭の # を外してください。
  • タグ - オプション項目よりそれぞれ以下設定おこないます。

    キー 値 - オプション
    Name handson-minilake
    • それぞれ任意の値で問題ありません。

その他項目は変更せず 、作成ボタンをクリックします。

OpenSearch Serviceの作成が始まり構築完了まで15分ほどかかります。

以下、キャプチャ画像は設定項目一覧です。

以下、キャプチャ画像は作成ボタンを押した後の画像です。

※作成に時間が掛かりますので待たずに「EC2、Fluentd、OpenSearch Serviceの設定」へ進んでください。

EC2、Fluentd、OpenSearch Serviceの設定

OpenSearch Serviceへアクセス権限をIAMロール「handson-minilake-role(任意)」の追加およびログ収集ソフトウェアFluentdからOpenSearch Serviceにログデータを送信するための設定を行います。

IAMロールの設定

  • AWSマネージメントコンソールの検索欄に「iam」と入力し、一覧に出てくる「IAM」をクリックします。
  • アクセス管理プルダウンメニューより「ロール」をクリック後、検索欄へ「handson-minilake-role(任意)」を入れ、一覧に出てきた対象ロールを押します。

  • 許可プルダウンメニューよりポリシーからアタッチをクリックします。

  • 検索欄へ「amazones」と入力し、「AmazonESFullAccess」へチェックし、「許可を追加」します。
  • クリック後、許可追加したIAMロール許可タブ、許可ポリシー一覧に「AmazonESFullAccess」があることを確認します。

ログ収集ソフトウェアFluentdの設定

FluentdからOpenSearch Serviceにログデータを送信するための設定を行います。

  • AWSマネージメントコンソールの検索欄に「OpenSearch Service」と入力し一覧にでてきます「Amazon OpenSearch Service」をクリックします。
  • 先ほど作成した「handson-minilake(任意)」をドメインのヘルス項目、名前一覧から探しクリックします。

  • 一般的な情報項目、ドメインエンドポイント (IPv4)箇所にあるURL https:// を除いた部分をコピーし分かりやすい場所に メモ しておきます。

  • Lab1でSSMよりEC2へアクセスしました再度、アクセスします。
    • OpenSearchプラグインのインストール状況を確認します。
      • # td-agent-gem list | grep plugin-elasticsearch
        fluent-plugin-elasticsearch (2.6.0, 2.4.0)
    • etc/td-agent/td-agent.conf」の設定をLab2向けに変更するために、あらかじめ用意されている /root/asset/2-td-agent.conf と置き替えます。
      • # \cp -pfv /root/asset/2-td-agent.conf /etc/td-agent/td-agent.conf
        ‘/root/asset/2-td-agent.conf’ -> ‘/etc/td-agent/td-agent.conf’
    • 置き替えが完了しましたら先ほど、コピーしたURLエンドポイントおよびOpenSearchのユーザ名、パスワードへ変更します。
      # cp -p /etc/td-agent/td-agent.conf /etc/td-agent/td-agent.conf.org
      # cp -p /etc/td-agent/td-agent.conf /etc/td-agent/td-agent.conf_$(date +%Y%m%d)
      # sed -i "s/<エンドポイント>/search-handson-minilake-***st-1.es.amazonaws.com/g" /etc/td-agent/td-agent.conf
      # sed -i "s/<マスターユーザー名>/aesadmin/g" /etc/td-agent/td-agent.conf
      # sed -i -r "s/<マスターパスワード>/MyPassword\&1/g" /etc/td-agent/td-agent.conf
    • sedコマンドでそれぞれ置き替えたのち結果が以下であることを確認します。
      • > host search-handson-minilake-***p-northeast-1.es.amazonaws.com
      • > user aesadmin
      • > password MyPassword&1
        diff /etc/td-agent/td-agent.conf.org /etc/td-agent/td-agent.conf コマンドで上記差分がでることを確認します。
    • 変更を反映するため、td-agentの再起動を実施します。
      # /etc/init.d/td-agent restart

      td-agentng td-agent:                                       [  OK  ]

      ※ログの中にエラーが出続けることがないかを確認します。起動に成功した場合、以下の文言が出力されます。
      [info]: #0 Connection opened to OpenSearch cluster => {.....

※実行される際は先頭の # を外してください。
*** 部分は意図的にマスクしていますので設定される際はご注意ください。

OpenSearch Serviceの設定

  • AWSマネージメントコンソールの検索欄に「OpenSearch Service」と入力し一覧にでてきます「Amazon OpenSearch Service」をクリックします。
  • マネージド型クラスタープルダウンメニューよりドメインをクリックし、作成した「handson-minilake(任意」ドメインの[ドメインのステータス]が[アクティブ] で、[検索可能なドキュメント] の件数が1件以上になっていることを確認し、「handson-minilake(任意)」ドメインをクリックします。

  • [OpenSearch DashboardsのIPv4]をクリックします。

  • OpenSearchのユーザ名、パスワードを入力し、「Log in」ボタンをクリックします。

  • Select your tenant 作業場所を選択できますが、今回は、「Private」へチェックを入れ、「Confirm」ボタンをクリックします。

  • [Welcome to OpenSearch]画面が表示されるため、[Explore on my own]を選択します。

  • OpenSearch Dashboardsの画面左にあるボタンアイコンをクリックし、 [Management]プルダウンメニューより[Index Management]をクリックします。

  • Create index patternボタンをクリックします。

  • Index pattern name項目に testappec2log-* を入力後、Next stepボタンをクリックします。
  • Time field項目より @timestamp を選択後、Create index patternボタンをクリックします。

  • OpenSearch Dashboardsの画面左にあるボタンアイコンをクリックし、 [Dashboad]をクリックします。
  • [Saved Objects]をクリックします。画面右上の [Import] をクリックします。

ハンズオン資料より「2-visualization.json」が提供されておりますのでこちらを使用してインポートします。

※リンク先、ダウンロードアイコンをクリックすることでダウンロード可能です。

  • インポート完了後、Importボタンをクリックします。
  • クリック後、 [Confirm all changes]ボタンをクリックしインポートを完了します。

  • 再度 [Saved Objects] 画面において、 [Import] アイコンをクリックし、2-dashboard.jsonをインポートします。

  • 2-dashboard.json

ハンズオン資料より「2-dashboard.json」が提供されておりますのでこちらを使用してインポートします。

※リンク先、ダウンロードアイコンをクリックすることでダウンロード可能です。

  • OpenSearch Dashboardsの画面左にあるボタンアイコンをクリックし、[Discover] をクリックします。
  • "Available fields"において、[alarmlevel]項目、右の[プラスボタン]をクリックします。同じように[user]項目右側の[プラスボタン]をクリックすると、対象のカラム(Time、alarmlevel、user)だけが表示されます。
  • 検索窓「user:"imai"」と入力し、Enterを押すと、「imai」というユーザーでフィルタリングされます。

Lab2で以下内容を実施しました。

  • OpenSearch Serviceを作成し、EC2ログ収集ソフトウェアから作成したOpenSearch Serviceへの送信設定をおこないました。
  • OpenSearch Service側でダッシュボード設定をハンズオン用にカスタムされたJSONからインポートしダッシュボード構築および、インデックスを設定しました。

おわりに

EC2のアプリケーションログをログ収集ソフトウェアFluentdよりOpenSearchへ送信することができ、よりグラフィカルに分析が可能になってくることが分かりました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA