ウェブアクション
    • PDF

    ウェブアクション

    • PDF

    Article Summary

    VPC環境で利用できます。

    NAVERクラウドプラットフォームコンソールのCloud Functions > Actionで、ウェブ属性のアクションを設定できます。 ウェブアクションは、Webサービスを提供できるCloud Functionsのアクションです。 簡単なコード作成だけでHTTP、HTML、SVG、JSON、TXTなどの形式のウェブページやデータなどをインターネットに公開できます。
    専用の認証ロジックが必要であれば、希望する認証ロジックをアクションコードに直接実装して利用するか、NAVERクラウドプラットフォームのAPI Gatewayを利用してウェブアクションに関連付けた外部接続アドレスにAPI KeyまたはIAM認証設定を追加して使用することができます。
    作成したアクションを実行してモニタリングする方法は、Action/Triggerの実行Actionをご参照ください。

    ウェブアクションの設定

    すべてのタイプ(基本、シーケンス)のアクションに対し、ウェブ属性をTrueに設定できます。 アクションの作成時にウェブアクションを設定する方法は以下のとおりです。

    1. ウェブ属性のアクションを作成します。
      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>`}
      }
      
    2. 外部接続アドレスを設定します。
    3. 呼び出して結果値を確認します。
      • リクエスト形式
      $ 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リクエストの処理

    ウェブアクションではない一般的なアクションの場合は認証がないと実行できません。また、JSON形式のオブジェクトを返す必要があります。 一方、ウェブアクションは認証なしで実行でき、headersstatusCodebodyなど様々なコンテンツでレスポンスするHTTPハンドラを実装するのに使用できます。
    ウェブアクションも一般アクションと同様にJSON形式のオブジェクトを返しますが、JSONオブジェクトの最上位属性で、次のうち1つ以上を含める場合はCloud Functionsシステムコントローラで異なる方法でウェブアクションを処理します。

    • headers:キーがヘッダ名で、値が文字列、数字、またはboolean値で構成されているJSONオブジェクト。 1つのヘッダに複数の値を送るには、ヘッダの値をJSON配列で構成する必要がある
    • statusCode:有効なHTTPステータスコード。bodyが空になっている場合、204 No Contentを返す(デフォルト値:200 OK)
    • body:一般テキスト、JSONオブジェクト、配列文字列、Base64でエンコードされたバイナリデータ(デフォルト値:空のレスポンス)。
    参考

    bodynullの場合、空の文字列("")の場合、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メソッド(GETPOSTPUTPATCHDELETEHEADOPTION)を通じて実行できます。

    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レスポンスを返すようにエラーメッセージを作成できます。


    この記事は役に立ちましたか?

    What's Next
    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.