サンプル集  >  other  >  API Gateway+Lambda(XML-RPC)
API Gateway+Lambda(XML-RPC)
2025/07/15

API Gateway+LambdaでXML-RPCを使ってみます。

  1. API Gatewayの作成 (上手くいかなかった)
  2. Lambdaの作成
  3. クライアントの作成
  4. 実行
  5. アクセス権限変更

API Gatewayの作成

「APIを作成」をクリックします。


下にスクロールさせてREST API欄の「構築」をクリックします。


API名を入力し画面右下の「API を作成」をクリックします。


リソース欄の「リソース作成」をクリックします。


「リソースを作成」をクリックします。


メソッド欄の「メソッドを作成」をクリックします。


Lambda関数欄に関数名を入力したら無効というエラーが出ました。


先にLambda関数を作っておく必要がありそうです。

Lambdaの作成

Lambdaのページの「関数を作成」をクリックします。


「関数の作成」をクリックします。


Dismissをクリックします。


Lambdaが作成されました。

「+ トリガーを追加」をクリックします。


「追加」をクリックします。


エラーが出ました。


ステージを先に作っておかないとダメなようです。

「新規のAPIを作成」に変更します。


トリガーが作成されました。


トリガーのAPI Gatewayを開きます。


「APIの設定」をクリックします。


「バイナリメディアタイプを追加」をクリックし「text/xml」と入力し「変更を保存」をクリックします。


正常に更新されたようです。


「APIをデプロイ」をクリックします。


ステージを default を選択し「デプロイ」をクリックします。


正常にデプロイされたようです。


Lambdaでは受け取ったeventをbase64でデコードし処理します。

lambda_function.py
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
49: 
50: 
51: 
52: 
53: 
54: 
55: 
56: 
57: 
58: 
59: 
import json
import xml.etree.ElementTree as ET
import base64

def lambda_handler(event, context):
    print(event)
    print(context)
    body = event.get("body""")

    if event.get("isBase64Encoded", False):
        body = base64.b64decode(body).decode("utf-8")

    try:
        root = ET.fromstring(body)
        method_name = root.find("methodName").text
        param_value = root.find("params/param/value/string").text

        if method_name == "greeting":
            response_message = f"Ohayou!!: {param_value}"
        else:
            response_message = f"Unknown method: {method_name}"    

        status_code = 200
        xml_response = f"""<?xml version="1.0"?>
<methodResponse>
  <params>
    <param>
      <value><string>{response_message}</string></value>
    </param>
  </params>
</methodResponse>"""    


    except Exception as e:
        status_code = 500
        xml_response = f"""<?xml version="1.0"?>
<methodResponse>
  <fault>
    <value>
      <struct>
        <member>
          <name>errorCode</name>
          <value><int>1</int></value>
        </member>
        <member>
          <name>errorMessage</name>
          <value><string>{str(e)}</string></value>
        </member>
      </struct>
    </value>
  </fault>
</methodResponse>"""


    return {
        "statusCode": status_code,
        "headers": {
            "Content-Type""text/xml"
        },
        "body": xml_response
    }

クライアントの作成

呼び元ではxmlrpc.clientを使ってXML-RPC呼び出しするようにしてみます。

sendXmlRpc.py
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
import xmlrpc.client

server_url = "https://xxx.amazonaws.com/default/xmlrpc-lambda"

proxy = xmlrpc.client.ServerProxy(server_url)

try:
    result = proxy.greeting("Hello!!")
    print("Result:", result)
except Exception as e:
    print("Error:", e)

実行

Lambdaをデプロイしクライアントを実行してみます。

>py sendXmlRpc.py
Result: Ohayou!!: Hello!!

期待通りに動作しました。

アクセス権限変更

API Gatewayのメソッドリクエストの設定の許可が「なし」になっているので「AWS IAM」に変更しておきます。

API Gatewayのリソースを選択しANYを選択しメソッドリクエストの設定の「編集」をクリックします。


メソッドリクエストの設定の許可の「AWS IAM」を選択し「保存」をクリックします。


API Gatewayをデプロイします。

再度クライアントを実行したところ403になりました。

>py sendXmlRpc.py
Error: <ProtocolError for xxx.amazonaws.com/default/xmlrpc-lambda: 40
3 Forbidden>

アクセスは遮断できているようです。

▲ PageTop  ■ Home


Copyright (C) 2025 ymlib.com