サンプル集  >  other  >  jsonのダンプを表示
jsonのダンプを表示
2023/07/08

サービス欄に「Lambda」と入力しLambdaの画面を開きます。


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


以下の情報を入力します。

関数名 jsondump
ランタイム Python 3.10

画面を下にスクロールさせて「関数の作成」をクリックします。


eventの内容をログに出すようにします。

lambda_function.py
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
import json
import logging

def lambda_handler(event, context):
    # TODO implement
    logger = logging.getLogger()

    logger.warn(f'{event=}')

    return {
        'statusCode': 200,
        'body': json.dumps('Lambda got your json!')
    }

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


「ソースを選択」をクリックします。


「API Gateway」を選択し、APIタイプは「REST API」を選択します。


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


「triggerの作成中にエラーが発生しました。上記のエラーを修正してください。」と画面下に表示されました。 「セキュリティ」欄の下に「このフィールドは必須です。」と表示されています。


「セキュリティ」で「IAM」を選択し「追加」をクリックします。


トリガーの位置に「API Gateway」が追加されました。

「API Gateway」をクリックします。


「API エンドポイント」の後ろに表示されているURLをクリックします。


Missing Authentication Token(認証トークンが見つかりません)と表示されました。

「API Gateway」の後ろに表示されている「jsondump-API」をクリックします。


メソッドリクエストの左の枠に表示されている「テスト」をクリックします。


画面を下にスクロールさせます。


「テスト」をクリックします。


下に結果が表示されました。

jsonをPOSTするプログラムを作ります。

jsonpost.py
 1: 
 2: 
 3: 

 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
import urllib.request, json

url = "https://xxx.execute-api.ap-northeast-1.amazonaws.com/defau
lt/jsondump"

method = "POST"
headers = {"Context-Type" : "application/json"}

req = urllib.request.Request(url, method=method, headers=headers)
with urllib.request.urlopen(req) as res:
    res = res.read().decode("utf-8")
    print(res)

実行してみます。

PS C:\pywork> py .\jsonpost.py
Traceback (most recent call last):
  File "C:\pywork\jsonpost.py", line 11, in <module>
    with urllib.request.urlopen(req) as res:
  File "C:\...\request.py", line 214, in urlopen
    return opener.open(url, data, timeout)
  File "C:\...\request.py", line 523, in open
    response = meth(req, response)
  File "C:\...\request.py", line 632, in http_response     
    response = self.parent.error(
  File "C:\...\request.py", line 561, in error
    return self._call_chain(*args)
  File "C:\...\request.py", line 494, in _call_chain       
    result = func(*args)
  File "C:\...\request.py", line 641, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

上の実行結果の...には「Users\xxx\AppData\Local\Programs\Python\Python39\lib\urllib」が表示されていました。

やはり403: Forbiddenが出ました。

curlコマンドでアクセスしてみます。

C:>curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/default/
jsondump -i
HTTP/1.1 403 Forbidden
Date: Sat, 08 Jul 2023 13:23:39 GMT
Content-Type: application/json
Content-Length: 42
Connection: keep-alive
x-amzn-RequestId: 44400000-00cc-44bb-aaaa-aaa999fff555
x-amzn-ErrorType: MissingAuthenticationTokenException
x-amz-apigw-id: HHH222bbbjjjmmm=

{"message":"Missing Authentication Token"}

結果は同じく403: Forbiddenでした。

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


「AuthenticationToken」で検索していたところ以下のページを見つけました。


リンクをクリックします。


「API メソッドで AWS Identity and Access Management (IAM) 認証がオンになっている場合に、APIリクエストが署名されていない」が原因のようです。

API Gatewayのステージのdefaultをクリックします。


レートとバーストを1にして「変更を保存」をクリックしました。

APIのリソースを開きます。


「アクション」を選択し「API のデプロイ」を選択します。


「デプロイされるステージ」のリストをクリックします。


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

状況は変わりませんでした。

APIのリソースを開きます。


「メソッドリクエスト」をクリックします。


「許可」がAWS IAMになっています。リストから「なし」を選択し右のチェックマークをクリックします。

状況は変わりませんでした。

APIのデプロイをしたところアクセスできるようになりました。


Pythonのプログラムからもアクセスできました。

PS C:\pywork> py .\jsonpost.py
"Hello from Lambda!"

curlコマンドでもアクセスできました。

C:>curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/default/
jsondump -i
HTTP/1.1 200 OK
Date: Sun, 09 Jul 2023 00:32:07 GMT
Content-Type: application/json
Content-Length: 20
Connection: keep-alive
x-amzn-RequestId: 00066688-33aa-44bb-8833-555eeebbbeee
x-amz-apigw-id: HHHxxx555jjjhhh=
X-Amzn-Trace-Id: Root=1-666aaa00-000777777888666666000ddd;Sampled=0;l
ineage=22233377:0

"Hello from Lambda!"

API Gatewayの許可設定をなしにしておくのは怖いのでAWS IAMに戻してデプロイしなおしておきました。

▲ PageTop  ■ Home


Copyright (C) 2023 - 2025 ymlib.com