目次
今回は、Snowflakeの外部関数とAWSのNLPサービス、
Amazon Comprehendを用いて、
Snowflake上で手軽に感情分析(いわゆるネガポジ判定)をできるようにします!
調査したところ先駆者がいましたので、
下記2つの記事を参考に少々アレンジして実装してみました。
- Snowflake external functions, Part 1 – Hello World tutorial for triggering AWS Lambda
- Snowflake external functions, Part 2 – How to do Natural Language Processing and analyze product reviews stored in Snowflake
ちなみに…
今年の8月に登壇したSnowVillage YouTube Liveでは
本記事の内容を一部実演しております。
お時間のある方はぜひご覧ください!
目指せ10000000000000000000000回再生!!
外部関数とは?
外部関数(External Function)とは、
Snowflakeから外部サービス上のコードを実行する機能です。
例えばAWS Lambda上のPythonコードを
あたかもSnowflakeの関数のように実行することができます。
※詳細はSnowflake公式ドキュメント 外部関数の紹介 をご確認ください。
Amazon Comprehendとは?
Amazon Comprehendとは、
機械学習を使用してテキストからインサイトを見つける自然言語処理 (NLP) サービスです。
下記のような特徴があります。
- テキストから感情分析(ネガポジ判定)やキーフレーズ抽出が可能
- フルマネージド型のため、一から学習させてモデルを構築する必要がない
- APIが用意されているため、各プログラミング言語から実行可能
※詳細はAWS公式HP Amazon Comprehend の特徴 をご確認ください。
構成図
今回実装する構成は下記の通りです。
SnowflakeからテキストをAPI Gateway経由で送り、
LambdaでComprehendのAPIを叩き、
感情分析した結果をAPI Gateway経由でSnowflakeに返す
…といった流れです。
実装してみよう
では実装を始めます!
AWSとSnowflakeのアカウントは
持っている前提で進めますので予めご留意ください。
1. AWS LambdaでAmazon Comprehendと連携する関数を作成
AWS Lambdaコンソールを開き、任意の名称でPythonの関数を作成します。
設定は下記の通り。
下記のコードをCopy&Pasteし、Deploy します。
言語コードとテキストを引数として受け取り、
ComprehendのDetectSentimentで感情分析した結果を返す処理を組んでいます。
Lambdaはデフォルトのタイムアウトが3秒と短いので、
設定 > 一般設定 > 編集 から最大の 15分 に変更しておきましょう。
続いてLambdaの実行ロールにComprehendへの
アクセス権限を付与する必要があるため、
アクセス権限 > ロール名 をクリックします。
IAMロールのコンソールが開きます。
ポリシーをアタッチします をクリックし、
ComprehendFullAccess を選択して
ポリシーのアタッチ をクリックすると、
一覧に反映されます。
これでAWS Lambdaの設定は完了です。
2. Snowflake認証用IAMロールを作成
後ほどSnowflake側のIAMを今作業中のAWS側に認証させる必要があるため、
事前にIAMロールを作成する必要があります。
IAMコンソールを開き、ロールを作成 をクリックします。
別のAWSアカウント を選択し、
Lambda作成時と同一のAWSの アカウントID を設定します。
次のステップ 以降は特に何も設定しないで良いので、
最後の確認ページまで進めましょう。
確認ページでは任意の ロール名 を入力して ロールの作成 を終えます。
ロール名は後で使用するのでメモしておきましょう!
3. Amazon API GatewayでAPIを作成
REST APIを作成します。
Amazon API Gateway コンソールを開き、
APIを作成 > REST APIの 構築 をクリックします。
REST 、新しいAPI にチェックし、
任意の API名 を入力し、APIの作成 をクリックします。
リソース > アクション > メソッドの作成 を行い、
POST を選択します。
セットアップ画面が表示されるので、
Lambda関数 と Lambdaプロキシ統合の使用 にチェックし、
先ほど作成した Lambda関数 をセットし、保存 します。
確認画面が表示されますが、OK です!
APIをデプロイします。
リソース > アクション > APIのデプロイ をクリックし、
任意の ステージ名 を入力したら デプロイ します。
デプロイ完了したらAPI呼び出し用URLが表示されるのでメモしておきます。
リソース に戻り、メソッドリクエストの ARN をメモしたら メソッドリクエスト をクリックします。
認可 を AWS IAM にして ✔ します。
続いて左下の リソースポリシー を開き、下記のコードをCopy&Pasteします。
※下記の値は置換して下さい。
- <12-digit-number> → AWSのアカウントID
- <external-function-role> → メモしたSnowflake認証用のIAMロール名
- <method-request-arn> → メモしたメソッドリクエストのARN
これでREST APIの作成は完了です。
4. SnowflakeでAPI統合を作成
ここでようやくSnowflakeのコンソールを開きます!
まずは 公式ドキュメント を参考に、API統合を作成します。
下記SQLをSnowflakeのワークシートにCopy&Pasteして実行してください。
※下記の値は置換して下さい。
- <api-integration-name> → 任意のAPI統合名
- <external-function-role-arn> → メモしたSnowflake認証用のIAMロール名
- <api-url> → メモしたAPI呼び出し用URL
正常に作成されました と表示されたらOKです!
※正常に作成できない場合は作業中のロールにAPI統合の権限が付与されていない可能性がありますので、設定を見直してください。
続いて、DESCRIBE INTEGRATION <api-integration-name>; を実行し、API統合の詳細情報を表示します。
API_AWS_IAM_USER_ARN と API_AWS_EXTERNAL_ID の値(property_value)をメモして下さい。次のステップで使用します。
5. Snowflake認証用IAMロールの信頼関係を編集
AWSに戻り、3. Amazon API GatewayでAPIを作成 にて作成したIAMロールをIAMコンソールから開きます。
信頼関係 タブから 信頼関係の編集 をクリックします。
デフォルトで下記のような値が入っていると思います。
赤枠の中身を、先ほどSnowflake側でメモした値に書き換えて下さい。
- ① → "" の中に API_AWS_IAM_USER_ARN の値 を入れる
- ② → {} の中に "StringEquals": { "sts:ExternalId": "API_AWS_EXTERNAL_ID の値" } を入れる
下記のようなイメージです。
編集を終えたら、信頼ポリシーの更新 をクリックします。
これで外部関数を作成するための準備が完了しました!
6. Snowflakeで外部関数を作成
Snowflakeに戻り、外部関数を作成します。
下記SQLをSnowflakeのワークシートにCopy&Pasteして実行してください。
引数はLambda関数に合わせて2つ定義しています。
※下記の値は置換して下さい。
- <external-function-name> → 任意の外部関数名
- <api-integration-name> → 先程作成したAPI統合名
- <api-url> → メモしたAPI呼び出し用URL
正常に作成されました と表示されたらOKです!
7. Let's ネガポジ祭
いよいよ外部関数の動作検証をします!
有効なパラメータはDetectSentimentを確認しておきましょう。
まずは日本語でネガティブっぽいテキストを入れて実行してみます。
結果はJSONで返ってきますので、クリックすると…
↓
↓
ネガティブ!
続いて英語でポジティブっぽいテキストを入れて実行してみます。
↓ポジティブ!
最後にアラビア語でニュートラルっぽいテキストを入れて実行してみます。
ニュートラル!
完璧ですね。
注意点
外部関数はAPI Gatewayを通過する仕様のため、API Gatewayの制限に縛られます。
例えばAPI Gatewayの最大ペイロードサイズは10MBのため、大量データの処理には向いていないといえます。ご注意ください!
最後に
いかがでしたでしょうか。
実装自体は結構ハードでしたが、
一度作ってしまえば気軽に試せる汎用性の高い関数になったと思います。
また、Amazon Comprehendは感情分析以外にも様々な機能が存在するので、
自信のある方はキーフレーズ抽出やエンティティ認識ができる外部関数の実装も試してみて下さい!
ちなみに…
序盤にご紹介しましたSnowVillage YouTube Liveでは
Twitterのデータからあの有名な〇〇さんの感情を分析し、
BIツールで可視化まで行っています!
この記事を見てご興味を持った方はぜひYouTubeもご覧下さい!