コラム

[AWS]Step Functionsでマイクロサービスを使用してローコード開発を実践

今回はAWSのStep FunctionsというAWS LambdaやAWSのサービスなどをフローチャートにより組み合わせて機能を作成する事が出来るローコードビジュアル開発ツールを使用してローコード開発を実践してみたいと思います。

目次

要件

簡単な商品見積機能を作成します。
商品情報を入力し、商品コードから商品を検索し価格を取得し、入力された荷姿の算出方法に従って原価算出と輸送費・関税の算出する機能を作成します。
今回はDBを使用せずに、必要なデータはLambda内に持っています。

入力する情報

  • 商品名コード
  • 荷姿(個別・ケース)
  • 数量

商品作成原価算出

  • 国内・個別 :入力された数量*単価(円)を見積金額とする
  • 国内・ケース:入力された数量*入り数(商品マスタから取得)*価格(円)を見積金額とする
  • 海外・個別 :入力された数量*単価(ドル)*レートを見積金額とする
  • 海外・ケース:入力された数量*入り数(商品マスタから取得)*価格(ドル)*レートを見積金額とする

輸送費算出

  • 中国 :定義してある価格に応じて配送費がかかる
  • 国内 :無料

配送費は商品又はケースの体積と数量を計算し、40'コンテナと20'コンテナがいくつ必要かを計算し、その金額をし出力する。

関税算出

  • 中国 :商品単価に応じて関税がかかる
  • 国内 :無料

完全は商品単価総計に関税率を乗算した金額を出力する。

設計

用意するLambda関数

Lambda関数は次の5つを用意する。
入力、出力ともJSON形式で行う。出力はPayloadの中にstatusCodeとbodyが入っている形式です。
statusCodeは正常終了又はエラー情報、bodyは処理結果が格納されています。

名称説明入力出力(body)
GetGoodsByCode渡された商品コードから商品情報を
取得するLambda関数です。
input.code:商品コード
code:商品コード
name:商品名
innerCount:入数
volume:体積
price:単価
caseVolume:ケース体積
EstimateHomeGoodsPrice国内の商品単価算出をするLambda関数input.count:数量
input.price:単価(円)
input.innerCount:入
totalPrice:商品単価合計
EstimateForeignGoodsPrice海外の商品単価算出をするLambda関数input.count:数量
input.price:単価($)
input.innerCount:入数
totalPrice:商品単価合計
CalcTransportationCost輸送費を算出する
Lambda関数
input.volume:体積
input.count:数量
twentyFeetVolumeCount:40’コンテナ個数
fouthFeetVolumeCount:20'コンテナ個数
totalAmount:輸送費合計
CalcImportDuty関税を算出する
Lambda関数
totalAmount:商品単価合計importDuty:関税

ワークフロー

① ステートマシンスタート

入力項目

  • 商品コード
  • 荷姿(個別・ケース)
  • 数量
  • 国(国内・中国)

②商品情報取得

入力コードで該当する商品情報を取得する。
GetGoodsByCode関数を使用する。

入力項目

  • 商品コード

出力項目

  • 商品コード
  • 商品名
  • 入数
  • 商品単価(¥)
  • 商品単価($)
  • 体積
  • ケース体積

③計算方法識別(Choice)

商品情報の値に応じて計算方法を識別する。

判定条件

  • 荷姿が個別、国が国内の場合「国内商品原価計算(個別)」を起動する。
  • 荷姿がケース、国が国内の場合「国内商品原価計算(ケース)」を起動する。
  • 荷姿が個別、国が国内で無い場合「海外商品原価計算(個別)」を起動する。
  • 荷姿がケース、国が国内で無い場合「海外商品原価計算(ケース)」を起動する。
  • それ以外(商品検索結果がエラーの場合)はFailStateに移動する。

④FailState

エラー情報を出力して処理を終了する。

⑤国内商品原価計算(個別)

個別の国内商品原価計算を行う。
EstimateHomeGoodsPrice関数を使用する。
(ケースの国内商品原価計算のLambdaと同じものを使用する)

入力項目

  • 数量
  • 商品単価(円):②で取得した商品情報の単価を使用する
  • 入数:1を固定で指定する

出力項目

  • 商品単価合計

⑥国内商品原価計算(ケース)

ケースの国内商品原価計算を行う。
EstimateHomeGoodsPrice関数を使用する。
(個別の国内商品原価計算のLambdaと同じものを使用する)

入力項目

  • 数量
  • 商品単価(円):②で取得した商品情報の単価を使用する
  • 入数:②で取得した入数を使用する

出力項目

  • 商品単価合計

⑦海外商品原価計算(個別)

個別の海外商品原価計算を行う。
EstimateForeignGoodsPrice関数を使用する。
(ケースの海外商品原価計算のLambdaと同じものを使用する)

入力項目

  • 数量
  • 商品単価($):②で取得した商品情報の単価を使用する
  • 入数:1を固定で指定する

出力項目

  • 商品単価合計

⑧輸送費計算(個別)

輸送費の計算を行う。
CalcTransportationCost関数を使用する。
(ケースの輸送費計算のLambdaと同じものを使用する)

入力項目

  • 数量
  • 体積:②で取得した商品情報の体積を使用する

出力項目

  • 40'コンテナ数量
  • 20'コンテナ数量
  • 輸送費

⑨海外商品原価計算(ケース)

ケースの海外商品原価計算を行う。
EstimateForeignGoodsPrice関数を使用する。
(個別の海外商品原価計算のLambdaと同じものを使用する)

入力項目

  • 数量
  • 商品単価($):②で取得した商品情報の単価を使用する
  • 入数:②で取得した入数を使用する

出力項目

  • 商品単価合計

⑩輸送費計算(ケース)

輸送費の計算を行う。
CalcTransportationCost関数を使用する。
(ケースの輸送費計算のLambdaと同じものを使用する)

入力項目

  • 数量
  • ケース体積:②で取得した商品情報のケース体積を使用する

出力項目

  • 40'コンテナ数量
  • 20'コンテナ数量
  • 輸送費

⑪関税計算

商品単価に対する関税額を計算する。
CalcCostDuty関数を使用する。

入力項目

  • 商品単価:⑦又は⑨で算出した商品単価合計を使用する

出力項目

  • 関税額

ワークフロー定義

次はワークフローの定義を具体的に見ていきます。

worflow studioでの定義

次の図は上記の図と同様ですが、それぞれのワークの定義を具体的に見ていきます。

画像に alt 属性が指定されていません。ファイル名: image-10-1024x554.png

①ステートマシンスタート

ステートマシン起動時にはステートマシン詳細の画面で実行する方法や、Api Gatewayから呼び出す方法などありますが、呼び出す際にJSON形式で必要なパラメータを渡す必要があります。
パラメータの形式を以下に示します。

{
    "code": "G0001", //存在する商品コードを指定
    "count": 10, //数量を指定
    "pack":"piece", //pieceかcaseを指定
    "country":"国内" //国内か中国を指定
}

商品情報取得

設定タブ

  • APIパラメータ:「GetGoodsByCode」を指定する
  • ペイロード:「Enter payload」を選択し、商品コードを入力値として設定する

出力タブ

  • ResultSelector を使用して結果を変換:Lambdaからの出力する値をワークフローで使用しやすいように変換する。bodyとstatusCodeのみを取得する様に設定。bodyの中身は文字列からJSONの形式に変換している。
  • ResultPath を使用して元の入力を出力に追加:ResultSelectorで設定した出力値と全ての入力値を出力する対象にしたい為、「Combine original input with result」を指定する。下の入力欄には、当該ワークの出力値をJSONのどのプロパティに含めるのか指定している。このワークでは「GetGoodsResult」の下に出力する。

③計算方法識別(Choice)

5つの方向に分岐するので分岐条件をそれぞれ指定しています。
Default ruleは全ての分岐条件に当てはまらない時の指定です。

④FailState

ErrorとCauseにエラーが起きた際に出力される適当なメッセージを入れて置きました。

⑤国内商品原価計算(個別)

設定タブ

  • APIパラメータ:「EstimateHomeGoodsPrice」を指定する
  • ペイロード:「Enter payload」を選択し、商品コード、単価、入数を入力値として設定する。入数は1を指定する。

出力タブ

  • ResultSelector を使用して結果を変換:他のワークと同様、statusCodeは使用しないので指定してない。
  • ResultPath を使用して元の入力を出力に追加:他のワークと同様に「Combine original input with result」を指定し、入力欄には「CalcEstimateResult」を設定する。

⑥国内商品原価計算(ケース)

設定タブ

  • APIパラメータ:「EstimateHomeGoodsPrice」を指定する
  • ペイロード:「Enter payload」を選択し、商品コード、単価、入数を入力値として設定する。入数は商品検索で取得した値を設定する。

出力タブ

  • ResultSelector を使用して結果を変換:他のワークと同様、statusCodeは使用しないので指定してない。
  • ResultPath を使用して元の入力を出力に追加:他のワークと同様に「Combine original input with result」を指定し、入力欄には「CalcEstimateResult」を設定する。

⑦海外商品原価計算(個別)

設定タブ

  • APIパラメータ:「EstimateHomeForeignPrice」を指定する
  • ペイロード:「Enter payload」を選択し、商品コード、単価、入数を入力値として設定する。入数は1を指定する。

出力タブ

  • ResultSelector を使用して結果を変換:他のワークと同様、statusCodeは使用しないので指定してない。
  • ResultPath を使用して元の入力を出力に追加:他のワークと同様に「Combine original input with result」を指定し、入力欄には「CalcEstimateResult」を設定する。

⑧輸送費計算(個別)

設定タブ

  • APIパラメータ:「CalcTransportationCost」を指定する
  • ペイロード:「Enter payload」を選択し、数量、体積を入力値として設定する。体積は商品検索で取得した値を指定する。

出力タブ

  • ResultSelector を使用して結果を変換:他のワークと同様、statusCodeは使用しないので指定してない。
  • ResultPath を使用して元の入力を出力に追加:他のワークと同様に「Combine original input with result」を指定し、入力欄には「CalcTransportationCostResult」を設定する。

⑨海外商品原価計算(ケース)

設定タブ

  • APIパラメータ:「EstimateHomeForeignPrice」を指定する
  • ペイロード:「Enter payload」を選択し、商品コード、単価、入数を入力値として設定する。入数は商品検索で取得した値を指定する。

出力タブ

  • ResultSelector を使用して結果を変換:他のワークと同様、statusCodeは使用しないので指定してない。
  • ResultPath を使用して元の入力を出力に追加:他のワークと同様に「Combine original input with result」を指定し、入力欄には「CalcEstimateResult」を設定する。

⑩輸送費計算(ケース)

設定タブ

  • APIパラメータ:「CalcTransportationCost」を指定する
  • ペイロード:「Enter payload」を選択し、数量、体積を入力値として設定する。体積は商品検索で取得したケース体積を指定する。

出力タブ

  • ResultSelector を使用して結果を変換:他のワークと同様、statusCodeは使用しないので指定してない。
  • ResultPath を使用して元の入力を出力に追加:他のワークと同様に「Combine original input with result」を指定し、入力欄には「CalcTransportationCostResult」を設定する。

⑪関税計算

設定タブ

  • APIパラメータ:「CalcImportDuty」を指定する
  • ペイロード:「Enter payload」を選択し、商品単価合計を入力値として設定する。値は原価計算で取得した値を指定する。

出力タブ

  • ResultSelector を使用して結果を変換:他のワークと同様、statusCodeは使用しないので指定してない。
  • ResultPath を使用して元の入力を出力に追加:他のワークと同様に「Combine original input with result」を指定し、入力欄には「CalcImportDutyResult」を設定する。

JSON定義

上記のワークフローを定義したJSONファイルを下記に記述します。
AWS上でインポートして使用する事が可能です。(XXXXXXXの部分は自分の環境の数値に置き換えて下さい)

{
  "Comment": "A description of my state machine",
  "StartAt": "商品情報取得",
  "States": {
    "商品情報取得": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXXXX:function:GetGoodsByCode:$LATEST",
        "Payload": {
          "input.code.$": "$.code"
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Next": "計算方法識別",
      "ResultPath": "$.GetGoodsResult",
      "ResultSelector": {
        "body.$": "States.StringToJson($.Payload.body)",
        "statusCode.$": "$.Payload.statusCode"
      }
    },
    "計算方法識別": {
      "Type": "Choice",
      "Choices": [
        {
          "And": [
            {
              "Variable": "$.pack",
              "StringEquals": "piece"
            },
            {
              "Variable": "$.country",
              "StringEquals": "国内"
            },
            {
              "Variable": "$.GetGoodsResult.statusCode",
              "NumericEquals": 200
            }
          ],
          "Next": "国内商品原価計算(個別)"
        },
        {
          "And": [
            {
              "Variable": "$.pack",
              "StringEquals": "case"
            },
            {
              "Variable": "$.country",
              "StringEquals": "国内"
            },
            {
              "Variable": "$.GetGoodsResult.statusCode",
              "NumericEquals": 200
            }
          ],
          "Next": "国内商品原価計算(ケース)"
        },
        {
          "And": [
            {
              "Variable": "$.pack",
              "StringEquals": "piece"
            },
            {
              "Not": {
                "Variable": "$.country",
                "StringEquals": "国内"
              }
            },
            {
              "Variable": "$.GetGoodsResult.statusCode",
              "NumericEquals": 200
            }
          ],
          "Next": "海外商品原価計算(個別)"
        },
        {
          "And": [
            {
              "Variable": "$.pack",
              "StringEquals": "case"
            },
            {
              "Not": {
                "Variable": "$.country",
                "StringEquals": "国内"
              }
            },
            {
              "Variable": "$.GetGoodsResult.statusCode",
              "NumericEquals": 200
            }
          ],
          "Next": "海外商品原価計算(ケース)"
        }
      ],
      "Default": "Fail"
    },
    "Fail": {
      "Type": "Fail",
      "Error": "NotExistGoodsCode",
      "Cause": "NotExistGoodsCode"
    },
    "国内商品原価計算(個別)": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXX:function:EstimateHomeGoodsPrice:$LATEST",
        "Payload": {
          "input.count.$": "$.count",
          "input.price.$": "$.GetGoodsResult.body.price",
          "input.innerCount": 1
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "End": true,
      "ResultSelector": {
        "body.$": "States.StringToJson($.Payload.body)"
      },
      "ResultPath": "$.CalcEstimateResult"
    },
    "国内商品原価計算(ケース)": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXX:function:EstimateHomeGoodsPrice:$LATEST",
        "Payload": {
          "input.count.$": "$.count",
          "input.price.$": "$.GetGoodsResult.body.price",
          "input.innerCount.$": "$.GetGoodsResult.body.innerCount"
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "ResultPath": "$.CalcEstimateResult",
      "ResultSelector": {
        "body.$": "States.StringToJson($.Payload.body)"
      },
      "End": true
    },
    "海外商品原価計算(個別)": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXX:function:EstimateForeignGoodsPrice:$LATEST",
        "Payload": {
          "input.count.$": "$.count",
          "input.price.$": "$.GetGoodsResult.body.priceDoll",
          "input.innerCount": 1
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "ResultSelector": {
        "body.$": "States.StringToJson($.Payload.body)"
      },
      "ResultPath": "$.CalcEstimateResult",
      "Next": "輸送費計算(個別)"
    },
    "輸送費計算(個別)": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "Payload": {
          "input.count.$": "$.count",
          "input.volume.$": "$.GetGoodsResult.body.volume"
        },
        "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXX:function:CalcTranspotationCost:$LATEST"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Next": "関税計算",
      "ResultPath": "$.CalcTransportationCostResult",
      "ResultSelector": {
        "body.$": "States.StringToJson($.Payload.body)"
      }
    },
    "関税計算": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXX:function:CalcImportDuty:$LATEST",
        "Payload": {
          "input.totalPrice.$": "$.CalcEstimateResult.body.totalPrice"
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "End": true,
      "ResultPath": "$.CalcImportDutyResult",
      "ResultSelector": {
        "body.$": "States.StringToJson($.Payload.body)"
      }
    },
    "海外商品原価計算(ケース)": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXX:function:EstimateForeignGoodsPrice:$LATEST",
        "Payload": {
          "input.count.$": "$.count",
          "input.price.$": "$.GetGoodsResult.body.priceDoll",
          "input.innerCount.$": "$.GetGoodsResult.body.innerCount"
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Next": "輸送費計算(ケース)",
      "ResultPath": "$.CalcEstimateResult",
      "ResultSelector": {
        "body.$": "States.StringToJson($.Payload.body)"
      }
    },
    "輸送費計算(ケース)": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXX:function:CalcTranspotationCost:$LATEST",
        "Payload": {
          "input.count.$": "$.count",
          "input.volume.$": "$.GetGoodsResult.body.caseVolume"
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Next": "関税計算",
      "ResultPath": "$.CalcTransportationCostResult",
      "ResultSelector": {
        "body.$": "States.StringToJson($.Payload.body)"
      }
    }
  }
}

Lambda実装

GetGoodsByCode

import json

def lambda_handler(event, context):
    
    # ここは本来はDBから取得するロジックを実装する、ディクショナリで疑似的なDBを作成
    goods1 = {'code' : 'G0001', 'name' : '商品A', 'innerCount': 80, 'volume' : 1, 'price' : 12000, 'caseVolume' : 10, 'priceDoll':90} 
    goods2 = {'code' : 'G0002', 'name' : '商品B', 'innerCount': 120, 'volume' : 1, 'price' : 10000, 'caseVolume' : 10, 'priceDoll':80}
    goodsDic = { 'G0001' : goods1, 'G0002' : goods2 }
    
    code = event['input.code']
    
    goods = goodsDic.get( code )
    if goods is None:
        statusCode = 400
        goods = ""
    else:
        statusCode = 200
    
    return {
        'statusCode': statusCode,
        'body': json.dumps(goods, ensure_ascii=False)
    }

EstimateHomeGoodsPrice

import json

def lambda_handler(event, context):

    count = event['input.count']
    price = event['input.price']
    innerCount = event['input.innerCount']
    
    totalPrice = price * innerCount * count
    
    body = {"totalPrice" : totalPrice}
    
    return {
        'statusCode': 200,
        'body': json.dumps( body )
    }

EstimateForeignGoodsPrice

import json

def lambda_handler(event, context):
    count = event['input.count']
    price = event['input.price']
    innerCount = event['input.innerCount']
    
    # 通常はDBから取得するが今回はレートは130に固定にしておく
    rate = 130
    
    totalPrice = price * rate * innerCount * count
    
    body = {"totalPrice" : totalPrice}
    
    return {
        'statusCode': 200,
        'body': json.dumps( body )
    }

CalcTransportationCost

import json

def lambda_handler(event, context):
    
    # コンテナ容量を指定、通常はDBから取得するが今回は実装内に固定
    fouthFeetVolume = 60
    twentyFeetVolume = 30
    
    # コンテナ使用料を指定、通常はDBから取得するが今回は実装内に固定
    fouthFeetAmount = 750
    twentyFeetAmount = 430
    
    # 通常はDBから取得するが今回はレートは130に固定にしておく
    rate = 130
    
    volume = event['input.volume']
    count = event['input.count']
    
    totalVolume = volume * count
    
    fouthFeetVolumeCount = 0
    twentyFeetVolumeCount = 0
    
    if totalVolume <= twentyFeetVolume:
        twentyFeetVolumeCount+=1
    else:
        if totalVolume <= fouthFeetVolume:
            fouthFeetVolumeCount+=1
        else:
            d = totalVolume // fouthFeetVolume
            fouthFeetVolumeCount += d
            d = totalVolume % fouthFeetVolume
            
            if d > 0:
                if d <= twentyFeetVolume:
                    twentyFeetVolumeCount+=1
                else:
                    fouthFeetVolumeCount+=1
    
    
    totalAmount = twentyFeetVolumeCount * twentyFeetAmount * rate
    totalAmount += fouthFeetVolumeCount * fouthFeetAmount * rate
    
    returnValue = {'twentyFeetVolumeCount' : twentyFeetVolumeCount, 'fouthFeetVolumeCount' : fouthFeetVolumeCount, 'totalAmount' : totalAmount}
    
    return {
        'statusCode': 200,
        'body': json.dumps(returnValue)
    }

CalcImportDuty

import json

def lambda_handler(event, context):
    
    # 関税率を指定、通常はDBから取得するが今回は実装内に固定
    importDutyRate = 0.028
    
    totalPrice = event['input.totalPrice']
    
    importDuty = totalPrice * importDutyRate 
    
    importDuty = round(importDuty, 2)
    
    returnValue = {'importDuty': importDuty}
    
    return {
        'statusCode': 200,
        'body': json.dumps(returnValue)
    }

実行してみる

海外・個別のケースを実行してみます。

入力値

{
    "code": "G0002",
    "count": 100,
    "pack":"piece",
    "country":"中国"
}

出力値

{
  "output": {
    "code": "G0002",
    "count": 100,
    "pack": "piece",
    "country": "中国",
    "GetGoodsResult": {
      "body": {
        "code": "G0002",
        "name": "商品B",
        "innerCount": 120,
        "volume": 1,
        "price": 10000,
        "caseVolume": 10,
        "priceDoll": 80
      },
      "statusCode": 200
    },
    "CalcEstimateResult": {
      "body": {
        "totalPrice": 1040000
      }
    },
    "CalcTransportationCostResult": {
      "body": {
        "twentyFeetVolumeCount": 0,
        "fouthFeetVolumeCount": 2,
        "totalAmount": 195000
      }
    },
    "CalcImportDutyResult": {
      "body": {
        "importDuty": 29120
      }
    }
  },
  "outputDetails": {
    "truncated": false
  }
}
この記事をシェアする
  • Facebookアイコン
  • Twitterアイコン
  • LINEアイコン

お問い合わせ ITに関するお悩み不安が少しでもありましたら、
ぜひお気軽にお問い合わせください

お客様のお悩みや不安、課題などを丁寧に、そして誠実にお伺いいたします。

お問い合わせはこちら
お電話でのお問い合わせ 03-5820-1777(平日10:00〜18:00)
よくあるご質問