web-dev-qa-db-ja.com

POST AWSラムダへのJSONオブジェクト

Aws APIゲートウェイを介してjsonオブジェクトをawslambda関数に投稿するにはどうすればよいですか?

p.s.-私の目標は、ラムダ関数をpythonに記述し、それをawsSQSに投稿することです。

前もって感謝します。

8
Sudip

私はそれを考え出した。これで、API Gateway Acceptiongクライアントが指定された形式のJSONデータを投稿し、それをAWS-Lambda関数に渡して、データをAWS-SQSにダンプしました。手順については、以下で詳しく説明します-

ステップ1-

サポートされている言語でラムダ関数を作成します(私はPython 3.6を使用しました)。サンプルコードは次のとおりです。

import boto3  
import json

def lambda_handler(event, context):

    sqs = boto3.resource('sqs')

    queue = sqs.get_queue_by_name(QueueName='userData')

    response = queue.send_message(MessageBody=json.dumps(event))

    return {
                "status":"0",
                "message":"",
                "pubId":event["ClientID"],
                "routetitle":event["routeTitle"]
            }

注:awsコンテキストで使用できるjsonライブラリとboto3ライブラリの両方をインポートしましたが、ファイルを追加する必要はありません。また、Lambda関数とSQSの両方が同じAWSリージョンにあるため、名前以外のSQSの詳細を指定していないことも確認してください。投稿されたJSONデータのみが含まれているため、「イベント」変数全体をSQSにダンプしています。

ステップ2-

AWSコンソールで「APIGateway」に移動し、新しいAPI Gatewayを作成してから、リソースの下に「POST」アクションを作成します。

スクリーンショットを確認してください

次に、投稿アクションの下で、[統合リクエスト]をクリックします。次に、以下の例のようにボディテンプレートを追加します-

{
  "userMobile" : "$input.params('userMobile')",
  "ClientID" : "$input.params('ClientID')",
  "routeTitle" : "$input.params('routeTitle')"
}

また、APIの「IntegrationType」が「Lambda」であり、STEP-1で作成したLambda関数がAPIに接続されていることを確認してください。

これで、ほぼ完了です。これで、作成したAPIのステージを作成し、APIをデプロイするだけです。 ***

デプロイ後のAPIのHTTPURLに注意してください。

ステップ3-

次に、「Simple Queuing Service(SQS)」に移動し、すべてのデフォルトパラメータを保持したままSimpleSQSを作成します。キュー名がLambda関数で指定したものと一致し、Lambda関数とSQSの両方が同じAWSリージョンにあることを確認してください。

これで、APIと同じ形式のJSONデータをPOSTできます。Lambda関数はそれをSQSキューにダンプし、そこでデータを表示できます。

Fidlerなどのツールを使用してAPIをテストすることもできます。

*** APIに変更を加えるたびに、必ずAPIを再デプロイしてください。

5
Sudip

はい、できます、

Lambdaプロキシ統合を使用してAPIGatewayからLambda関数をトリガーすると、リクエストは以下のようなペイロードで関数を呼び出します。ご覧のとおり、必要なのはJSON本体属性を解析することだけです。

  {
    "resource": /path",
    "path": "/path",
    "httpMethod": "PUT",
    "headers": {
      "Accept": "*/*",
      "Accept-Encoding": "gzip, deflate, sdch, br",
      "Accept-Language": "en-US,en;q=0.8,pl;q=0.6,en-GB;q=0.4",
      "Cache-Control": "no-cache",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "PL",
      "Content-Type": "application/json",
      "DNT": "1",
      "Host": "api.stockflare.com",
      "Origin": "http://localhost:3000",
      "Pragma": "no-cache",
      "Referer": "http://localhost:3000/databank",
      "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36",
      "Via": "1.1 XXXXX.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "XXXXXX==",
      "X-Amzn-Trace-Id": "Root=XXXXXX",
      "X-Forwarded-For": "XXXXX",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
    },
    "queryStringParameters": null,
    "pathParameters": null,
    "stageVariables": null,
    "requestContext": {
      "path": "/path",
      "accountId": "XXXXX",
      "resourceId": "p0flbp",
      "stage": "v1",
      "requestId": "XXXXX",
      "identity": {
        "cognitoIdentityPoolId": null,
        "accountId": null,
        "cognitoIdentityId": null,
        "caller": null,
        "apiKey": "",
        "sourceIp": "XXXXXX",
        "accessKey": null,
        "cognitoAuthenticationType": null,
        "cognitoAuthenticationProvider": null,
        "userArn": null,
        "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36",
        "user": null
      },
      "resourcePath": "/path",
      "httpMethod": "PUT",
      "apiId": "XXXXXX"
    },
    "body": "{\"fields\":[\"forecast_pe\"],\"countries\":[\"_all\",\"amer\",\"apac\",\"emea\"],\"sectors\":[\"50\",\"51\"]}",
    "isBase64Encoded": false
  }
0
Mark Stratmann