- 印刷する
- PDF
ウェブアクション
- 印刷する
- PDF
Classic環境で利用できます。
NAVERクラウドプラットフォームコンソールのCloud Functions > Actionで、ウェブ属性のアクションを設定できます。 ウェブアクションは、Webサービスを提供できるCloud Functionsのアクションです。 簡単なコード作成だけでHTTP、HTML、SVG、JSON、TXTなどの形式のウェブページやデータなどをインターネットに公開できます。
専用の認証ロジックが必要であれば、希望する認証ロジックをアクションコードに直接実装して利用するか、NAVERクラウドプラットフォームのAPI Gatewayを利用してウェブアクションに関連付けた外部接続アドレスにAPI KeyまたはIAM認証設定を追加して使用することができます。
作成したアクションを実行してモニタリングする方法は、Action/Triggerの実行とActionをご参照ください。
ウェブアクションの設定
すべてのタイプ(基本、シーケンス)のアクションに対し、ウェブ属性をTrueに設定できます。 アクションの作成時にウェブアクションを設定する方法は以下のとおりです。
- ウェブ属性のアクションを作成します。
- 作成方法:基本アクションとシーケンスアクションを参照
- Node.js形式のウェブアクションコードの例
function main({name}) { var msg = 'you did not tell me who you are.'; if (name) { msg = `hello ${name}!` } return {body: `<html><body><h3>${msg}</h3></body></html>`} }
- 外部接続アドレスを設定します。
- 外部接続アドレスの設定方法:Action/Triggerの実行を参照
- 呼び出して結果値を確認します。
- リクエスト形式
$ curl --header "Content-Type: application/json" \ --data '{"name":"cloud functions"}' \ --request POST https://{product_id}.apigw.ntruss.com/{api_name}/{stage_name}/{resource_name}/http
- レスポンス形式
<html><body><h3>hello cloud functions!</h3></body></html>
HTTPリクエストの処理
ウェブアクションは、headers、statusCode、bodyなど様々なコンテンツでレスポンスするHTTPハンドラを実装するのに使用できます。
ウェブアクションも一般アクションと同様にJSON形式のオブジェクトを返しますが、JSONオブジェクトの最上位属性で、次のうち1つ以上を含める場合はCloud Functionsシステムコントローラで異なる方法でウェブアクションを処理します。
headers
:キーがヘッダ名で、値が文字列、数字、またはboolean値で構成されているJSONオブジェクト。 1つのヘッダに複数の値を送るには、ヘッダの値をJSON配列で構成する必要があるstatusCode
:有効なHTTPステータスコード。bodyが空になっている場合、204 No Contentを返す(デフォルト値:200 OK)body
:一般テキスト、JSONオブジェクト、配列文字列、Base64でエンコードされたバイナリデータ(デフォルト値:空のレスポンス)。
body
がnull
の場合、空の文字列(""
)の場合、undefinedの場合はコンテンツがないと判断します。
Cloud Functionsシステムコントローラは、リクエストやレスポンスの終了時にアクションで指定したヘッダをHTTPクライアントに伝達し、HTTPクライアントはステータスコードでレスポンスします。bodyはレスポンスのbodyで伝達されます。 content-type header
が結果のheaders
に定義されていない場合、bodyは本文が文字列ではない場合に対してapplication/json
と解釈され、それ以外にはtext/html
と解釈されます。
content-type
が定義されていてレスポンスがバイナリデータであるか、一般テキストである場合、Cloud Functionsシステムコントローラは必要に応じてBase64デコーダで文字列をデコードします。 このとき、本文が正しくデコードされていないと、エラーと判断します。
Raw HTTPの処理
Cloud FunctionsはAkka HTTPフレームワークを使用してバイナリと一般テキストコンテンツタイプを判断するため、Cloud FunctionsのウェブアクションはHTTP本文を効果的に解析・処理できます。 例えば、リクエスト時に使用したHTTPメソッドを確認するために、params.__ow_method
値をコードで使用できます。 参考となるサンプルコードと実行結果は以下のとおりです。
- サンプルコード
function main(params) { return params }
- 実行結果
$ curl https://{Action_URL}/json?key=value -X POST -H "Content-Type: application/json" -d '{"key":"value"}' { "response": { "__ow_method": "post", "__ow_body": "", "__ow_headers": { "accept": "*/*", "connection": "close", "content-length": "15", "content-type": "application/json", "host": "172.17.0.1", "user-agent": "curl/7.43.0" }, "__ow_path": "", "key": "value" } }
Base64タイプのバイナリデコード
Raw HTTPで処理する時、content-typeがバイナリの場合には__ow_body
、コンテンツはBase64にエンコードされていると予想されます。 以下のサンプルコードで、様々なランタイム環境でエンコードされた本文をどのように扱うのか確認できます。
- Node.js
function main(args) { decoded = new Buffer(args.__ow_body, 'base64').toString('utf-8') return {body: decoded} }
- Python
def main(args): try: decoded = args['__ow_body'].decode('base64').strip() return {"body": decoded} except: return {"body": "Could not decode body from Base64."}
- Swift
extension String { func base64Decode() -> String? { guard let data = Data(base64Encoded: self) else { return nil } return String(data: data, encoding: .utf8) } } func main(args: [String:Any]) -> [String:Any] { if let body = args["__ow_body"] as? String { if let decoded = body.base64Decode() { return [ "body" : decoded ] } } return ["body": "Could not decode body from Base64."] }
上記のサンプルコードの関数を保存してRaw HTTPウェブアクションを作成し、実際にウェブ作業をテストできます。 以下は、Node.js関数をdecode
アクションとして保存し、コマンドを実行した結果の例です。
$ curl -k -H "Content-Type: text/plain" -X POST -d "RGVjb2RlZCBib2R5" https://{Action_URL}/json
{
"body": "Decoded body"
}
OPTIONSリクエスト
OPTIONSリクエストは、基本的にCORSヘッダがレスポンスヘッダに自動的に追加されます。 これらのヘッダはすべてのOriginを許可し、OPTIONS、GET、DELETE、POST、PUT、HEAD、PATCHメソッドを許可します。 追加でHTTPリクエストが存在する場合、Access-Control-Request-Headers
ヘッダはAccess-Control-Allow-Headers
ヘッダにエコーバックされます。 作成されるデフォルト値は以下のとおりです。
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: OPTIONS, GET, DELETE, POST, PUT, HEAD, PATCH
Access-Control-Allow-Headers: Authorization, Content-Type
OPTIONSリクエストはウェブアクションにより手動で処理できます。 これのために、web-custom-options
オプションをtrue
値にして有効にします。 この機能が有効になるとCORSヘッダは自動で追加されなくなるため、ユーザーが直接プログラミングしてヘッダを決定し、追加する必要があります。 以下は、OPTIONSリクエストにユーザーが手動でレスポンスするサンプルコードです。
function main(params) {
if (params.__ow_method == "options") {
return {
headers: {
'Access-Control-Allow-Methods': 'OPTIONS, GET',
'Access-Control-Allow-Origin': 'example.com'
},
statusCode: 200
}
}
}
以下は、上記の関数を保存した後にコマンドを実行した結果の例です。
$ curl https://{Action_URL}/http -kvX OPTIONS
< HTTP/1.1 200 OK
< Server: nginx/1.11.13
< Content-Length: 0
< Connection: keep-alive
< Access-Control-Allow-Methods: OPTIONS, GET
< Access-Control-Allow-Origin: example.com
追加機能
ウェブアクションで提供する追加機能は以下のとおりです。
Content extensions
希望するコンテンツタイプを/json
、/html
、/http
、/svg
、/text
の中の一つに指定します。 URIのアクション名に拡張子を追加することで実行され、/{web_action_url}
アクションはHTTPレスポンスを受け取るために/{web_action_url}/http
のように使用されます。
コンテンツタイプが指定されないと、アクションは実行されません。
Query and body parameters as input
アクションはリクエスト本文のパラメータだけでなく、クエリパラメータを取得します。 このようなパラメータをマージする際の優先順位は、パッケージパラメータ、アクションパラメータ、クエリパラメータの順で、重複する場合はそれぞれの以前の値を順に再定義します。 例えば、/{Web_Action_URL}/http/?name=Jane
のようなリクエストは入力パラメータとして{name: "Jane"}
をアクションに伝達します。
Form data
標準application/json
以外にも、ウェブアクションはURLエンコードされたform data application/x-www-form-urlencoded data
も入力として取得できます。
Activation via multiple HTTP verbs
ウェブアクションはHTTPメソッド(GET
、POST
、PUT
、PATCH
、DELETE
、HEAD
、OPTIONS
)を通じて実行できます。
Non JSON body and raw HTTP entity handling
ウェブアクションはJSONオブジェクト以外のHTTPリクエストbodyを処理でき、理解できない値(バイナリではない場合、一般文字列またはBase64にエンコードされた文字列)も常に取得するように選択できます。
エラーの処理
ウェブアクションが失敗した場合、以下のような2つの失敗モードで処理されます。
- application error:アクションがエラー属性を持つ最上位JSONオブジェクトをリターン。catch例外に類似
- developer error:アクションが失敗してレスポンスを作成しないときに発生。uncaught例外に類似
application errorはユーザーが指定して処理する必要があり、ウェブアクションのコンテンツタイプに応じてエラーメッセージを作成することをお勧めします。 例えば、.http
拡張子と共に使用されるウェブアクションは拡張子のcontent-typeとエラーレスポンスアクションのcontent-typeが一致するように、{error: { statusCode: 400 }
と同じHTTPレスポンスを返すようにエラーメッセージを作成できます。