現代のデータドリブンな状況においては、アプリケーションの大半が高度にデータ集約的なものへと進化しています。しかし、特にユーザー数が増加し、データの量と複雑さが増している中では、優れたデータアプリケーションの開発が困難となる場合があります。Snowflakeは、多くのデータアプリケーションを支える原動力であり、ソフトウェアチームがエンジニアリングを迅速化し、運用上の複雑さに煩わされず、スケーラブルなアプリケーションを作成できるようにします。Snowflakeは、エンジニアリングの迅速化に重点を置いており、極めて高いパフォーマンスとスケーラビリティをアプリケーションに提供します。
Snowflakeは、データアプリの開発を促進するためにSQL APIを提供しています。SQL APIは、Snowflakeデータベース内でのデータのシームレスなアクセスと操作を可能にするRESTful APIです。SQL APIは、お使いのアプリケーションとSnowflakeの橋渡しの役割を果たし、プログラムによるデータの取得と更新を可能にします。
このチュートリアルでは、架空のキッチンカー会社であるTasty Bytesとキッチンカーの運転手が顧客からの注文を確認し、運転手が配達時に注文を完了処理できるアプリケーションを作成します。このチュートリアルでは、SQL APIを活用してキッチンカー運転手向けのReact Nativeアプリケーションを開発するプロセスについて説明します。
ここでは、Tasty Bytesの注文データを使用します。注文データを使用して、以下の機能を持つキッチンカーの運転手用のアプリケーションを構築します。
SnowflakeウェブインターフェイスであるSnowsightを使用して、次のことを行います。
ワークシートに移動し、右上の「+」をクリックして新しいワークシートを作成し、「SQLワークシート」を選択します。
ワークシートに以下のSQLを貼り付けて実行します。このSQLは、Snowflakeオブジェクト(ウェアハウス、データベース、スキーマ)を作成し、S3から未加工の注文データを取り込み、それをダウンストリームで使用するためにモデリングするためのものです。
-- use our accountadmin role
USE ROLE accountadmin;
-- create our database
CREATE OR REPLACE DATABASE frostbyte_tasty_bytes_app;
-- create raw, harmonized, and analytics schemas
-- raw zone for data ingestion
CREATE OR REPLACE SCHEMA frostbyte_tasty_bytes_app.raw;
-- harmonized zone for data processing
CREATE OR REPLACE SCHEMA frostbyte_tasty_bytes_app.harmonized;
-- analytics zone for data driven insights
CREATE OR REPLACE SCHEMA frostbyte_tasty_bytes_app.analytics;
-- create csv file format
CREATE OR REPLACE FILE FORMAT frostbyte_tasty_bytes_app.raw.csv_ff
type = 'csv';
-- create an external stage pointing to S3
CREATE OR REPLACE STAGE frostbyte_tasty_bytes_app.raw.s3load
COMMENT = 'Quickstarts S3 Stage Connection'
url = 's3://sfquickstarts/frostbyte_tastybytes/app/app_orders/'
file_format = frostbyte_tasty_bytes_app.raw.csv_ff;
-- create our raw.app_order_header table
CREATE OR REPLACE TABLE frostbyte_tasty_bytes_app.raw.app_order_header
(
order_id NUMBER(19,0),
month NUMBER(2,0),
day NUMBER(2,0),
hour NUMBER(2,0),
minute NUMBER(2,0),
second NUMBER(2,0),
order_total NUMBER(19,3),
order_tax_amount NUMBER(2,0),
first_name VARCHAR,
last_name VARCHAR,
gender VARCHAR,
order_status VARCHAR
);
-- create our raw.order_detail table
CREATE OR REPLACE TABLE frostbyte_tasty_bytes_app.raw.app_order_detail
(
order_id NUMBER(19,0),
order_detail_id NUMBER(19,0),
menu_item_name VARCHAR,
quantity NUMBER(2,0),
unit_price NUMBER(19,3)
);
-- create our virtual warehouse
CREATE OR REPLACE WAREHOUSE tasty_app_wh AUTO_SUSPEND = 60;
-- use our TASTY_APP_WH virtual warehouse so we can load our data
USE WAREHOUSE tasty_app_wh;
-- ingest from S3 into the app_order_header table
COPY INTO frostbyte_tasty_bytes_app.raw.app_order_header
FROM @frostbyte_tasty_bytes_app.raw.s3load/app_order_header.csv.gz;
-- ingest from S3 into the app_order_detail table
COPY INTO frostbyte_tasty_bytes_app.raw.app_order_detail
FROM @frostbyte_tasty_bytes_app.raw.s3load/app_order_detail.csv.gz;
-- create our harmonized.data_app_orders_v view
CREATE OR REPLACE VIEW frostbyte_tasty_bytes_app.harmonized.data_app_orders_v
AS
SELECT
oh.order_id,
TIMESTAMP_NTZ_FROM_PARTS(YEAR(CURRENT_DATE()),oh.month,oh.day,oh.hour,oh.second, 0) AS order_ts,
oh.order_total,
oh.order_tax_amount,
oh.first_name,
oh.last_name,
oh.gender,
oh.order_status,
od.order_detail_id,
od.menu_item_name,
od.quantity,
od.unit_price
FROM frostbyte_tasty_bytes_app.raw.app_order_header oh
JOIN frostbyte_tasty_bytes_app.raw.app_order_detail od
ON oh.order_id = od.order_id;
-- promote our view to analytics
CREATE OR REPLACE VIEW frostbyte_tasty_bytes_app.analytics.data_app_orders_v
AS
SELECT * FROM frostbyte_tasty_bytes_app.harmonized.data_app_orders_v;
-- view orders data
SELECT * FROM frostbyte_tasty_bytes_app.analytics.data_app_orders_v;
堅牢なセキュリティ対策を確保するには、個人アカウントとは別に、アプリケーション専用のユーザーアカウントを設定することが不可欠です。この新しいアカウントは、Snowflakeのクエリに使用されます。セキュリティに関するベストプラクティスに従い、このアカウントではキーペア認証を採用し、アクセスをSnowflake環境内に制限します。
以下のコマンドを実行して、非公開キーと公開キーを作成します。これらのキーは、Snowflakeでユーザーを認証するために必要となります。
$ cd ~/.ssh
$ openssl genrsa -out snowflake_app_key 4096
$ openssl rsa -in snowflake_app_key -pubout -out snowflake_app_key.pub
以下のSQLステートメントを実行してユーザーアカウントを作成し、アプリケーションに必要なデータへのアクセス権を付与します。
-- use our securityadmin role
USE ROLE securityadmin;
-- create the tasty_bytes_data_app_demo role
CREATE OR REPLACE ROLE tasty_bytes_data_app_demo;
-- use our securityadmin role
USE ROLE accountadmin;
-- grant privileges to our tasty_bytes_data_app_demo role
GRANT USAGE ON WAREHOUSE tasty_app_wh TO ROLE tasty_bytes_data_app_demo;
GRANT USAGE ON DATABASE frostbyte_tasty_bytes_app TO ROLE tasty_bytes_data_app_demo;
GRANT USAGE ON SCHEMA frostbyte_tasty_bytes_app.analytics TO ROLE tasty_bytes_data_app_demo;
GRANT USAGE ON SCHEMA frostbyte_tasty_bytes_app.harmonized TO ROLE tasty_bytes_data_app_demo;
GRANT USAGE ON SCHEMA frostbyte_tasty_bytes_app.raw TO ROLE tasty_bytes_data_app_demo;
GRANT SELECT ON ALL VIEWS IN SCHEMA frostbyte_tasty_bytes_app.analytics TO ROLE tasty_bytes_data_app_demo;
GRANT SELECT ON ALL VIEWS IN SCHEMA frostbyte_tasty_bytes_app.harmonized TO ROLE tasty_bytes_data_app_demo;
GRANT SELECT ON ALL TABLES IN SCHEMA frostbyte_tasty_bytes_app.analytics TO ROLE tasty_bytes_data_app_demo;
GRANT SELECT ON ALL TABLES IN SCHEMA frostbyte_tasty_bytes_app.harmonized TO ROLE tasty_bytes_data_app_demo;
GRANT SELECT ON ALL TABLES IN SCHEMA frostbyte_tasty_bytes_app.raw TO ROLE tasty_bytes_data_app_demo;
GRANT UPDATE ON TABLE frostbyte_tasty_bytes_app.raw.app_order_header TO ROLE tasty_bytes_data_app_demo;
-- use our useradmin role
USE ROLE useradmin;
-- Open the ~/.ssh/snowflake_app_key.pub file from Step 1 and copy the contents starting just after the PUBLIC KEY header,
-- and stopping just before the PUBLIC KEY footer for INSERT_RSA_PUBLIC_KEY_HERE. Make sure to remove the additinal spaces. It should be a single line string.
CREATE OR REPLACE USER data_app_demo
RSA_PUBLIC_KEY='<INSERT_RSA_PUBLIC_KEY_HERE>'
DEFAULT_ROLE=frostbyte_tasty_bytes_app
DEFAULT_WAREHOUSE=tasty_app_wh
MUST_CHANGE_PASSWORD=false;
-- use our securityadmin role
USE ROLE securityadmin;
GRANT ROLE tasty_bytes_data_app_demo TO USER data_app_demo;
皆さんが実行するアプリケーションはReact Nativeで記述されます。
git clone https://github.com/sf-gh-sjasti/TastyBytesReactNativeAppWithSnowflake-SQL_API.git reactNativeApp
を使用してレポジトリをクローンします。cd reactNativeApp
に移動します。npm install
を実行して依存関係をインストールします。reactNativeApp
フォルダを開きます。.env
ファイルを開き、非公開キーでPRIVATE_KEY
の値を更新します。ヘッダー(-----BEGIN RSA PRIVATE KEY-----
)とフッター(-----END RSA PRIVATE KEY-----
)を含め、~/.ssh/snowflake_app_key
から非公開キー全体をコピー&ペーストします。SNOWFLAKE_ACCOUNT_IDENTIFIER
を自分のSnowflakeアカウントに更新してください。(あるいは)米国西部以外の場所に所在している場合は、SNOWFLAKE_ACCOUNT_IDENTIFIER
を「.」に更新してください。Snowflakeからsnowflake_accountの値を取得するには、SnowsightでSELECT CURRENT_ACCOUNT()
を実行してください。Snowflakeからリージョン値を取得するには、SnowsightでSELECT CURRENT_REGION()
を実行してください。SNOWFLAKE_ACCOUNT_IDENTIFIERとSNOWFLAKE_ACCOUNTは米国西部では同じとなります。SNOWFLAKE_ACCOUNT
を自分のSnowflakeアカウントに更新します。PUBLIC_KEY_FINGERPRINT
を自分のユーザー公開キーのフィンガープリントに更新します。公開キーのフィンガープリントを取得するには、SnowsightでSQL、DESCRIBE USER data_app_demo
を実行し、RSA_PUBLIC_KEY_FPプロパティ値を取得します。ここでは、SQL APIを使用し、Snowflakeでキーペア認証を使用して認証を行います。JWTトークンの生成方法については、Tokens.js
を参照してください。Orders.js
には、「注文」画面をレンダリングするためのソースコードがあります。このファイルには、SQL API呼び出しの開始方法と必要なヘッダーに関する情報も記載されています。OrderDetails.js
には、「注文の詳細」画面をレンダリングするためのソースコードがあります。
npx expo start --clear
を実行し、w
キーを押してWebブラウザでアプリを実行します。4. 注文の詳細を表示するには、「View Order(注文を表示)」ボタンをクリックします。 5. 注文を完了処理するには、「ORDER READY(注文準備完了)」ボタンをクリックします。この操作により、この注文の注文ステータスの値が「完了」に更新され、「キュー内の注文」画面に戻ります。 6. ここで、「注文履歴」タブをクリックすると、完了した注文を確認できます。 ## クリーンアップ
Snowsightワークシートに移動し、右上の「+」をクリックして新しいワークシートを作成し、「SQLワークシート」を選択します。次のSQLをワークシートに貼り付けて実行し、クイックスタートで作成したSnowflakeオブジェクトを削除します。
USE ROLE accountadmin;
DROP DATABASE frostbyte_tasty_bytes_app;
DROP WAREHOUSE tasty_app_wh;
USE ROLE securityadmin;
DROP USER data_app_demo;
DROP ROLE tasty_bytes_data_app_demo;
**お疲れ様でした。**Tasty Bytes - SQL APIによるReact Nativeデータアプリケーションの開発クイックスタートを無事完了しました。
これにより、次のことを学習しました。
引き続きSnowflakeデータクラウドについて学習するには、以下のリンクから利用可能なTasty Bytes - クイックスタートをご覧ください。