0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon API GatewayとAWS Lambdaを組み合わせてみた

Posted at

はじめに

こんにちは。
今回はAPI Gateway、Lambda、Translateを連携させてみました。

本記事は以下記事の続編です。

↓参考にしたハンズオンはこちら。

↓今回のゴール
image.png

やってみた

マネジメントコンソールにアクセスし、API Gatewayのページにアクセスします。
前回作成したtranslate-apiをクリックします。
image.png

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

リソース名はtranslateとして「リソースを作成」をクリックします。
image.png

「メソッドを作成」をクリックします。
image.png

メソッドタイプは「GET」、Lambda関数と連携するので、統合タイプは「Lambda統合」、「Lambdaプロキシ統合」をONにし、Lambda関数には「translate-function(Translateを呼び出す関数)」を指定します。
image.png

下にスクロールして「メソッドを作成」をクリックします。
image.png

メソッドリクエストタブを開き、「編集」をクリックします。
image.png

URLクエリ文字列パラメータをクリックし、「クエリ文字列を追加」をクリックします。
image.png

名前はinput_text、必須にチェックを入れます。
image.png

「Lambda統合」をクリックし、「translate-function」をクリックします。
Lambdaのページが別タブで開きます。
image.png

API Gateway側のルールに従って、Lambda関数の出力を修正します。
Lambda プロキシ統合では、Lambda 関数は以下の形式で出力を返す必要があります。
参考:https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-integration-settings-integration-response.html

{
    statusCode: "...",            // a valid HTTP status code
    headers: { 
        custom-header: "..."      // any API-specific custom header
    },
    body: "...",                  // a JSON string.
    isBase64Encoded:  true|false  // for binary support
}

以前作ったLambda関数には、statusCodeやbodyは既にreturnに含まれていますので、headersとisBase64Encodedを追加します。
下から2~3行目の部分ですね。

import json
import boto3

translate = boto3.client('translate')

def lambda_handler(event, context):
    
    input_text = '私が一番好きなコナン映画は天国への'
    
    response = translate.translate_text(
        Text=input_text,
        SourceLanguageCode='ja',
        TargetLanguageCode='en'
    )

    output_text = response.get('TranslatedText')

    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': output_text   
        }),
        'isBase64Encoded': False,
        'headers': {}
    }

次にテストタブを開きます。
「新しいイベントを作成」をクリックし、イベント名を入力します。
テンプレートにはapigateway-aws-proxyを選択します。
image.png

以下がそのテンプレートです。
API Gatewayからどのように情報が渡ってくるかを示しています。

{
  "body": "eyJ0ZXN0IjoiYm9keSJ9",
  "resource": "/{proxy+}",
  "path": "/path/to/resource",
  "httpMethod": "POST",
  "isBase64Encoded": true,
  "queryStringParameters": {
    "foo": "bar"
  },
  "multiValueQueryStringParameters": {
    "foo": [
      "bar"
    ]
  },
  "pathParameters": {
    "proxy": "/path/to/resource"
  },
  "stageVariables": {
    "baz": "qux"
  },
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding": "gzip, deflate, sdch",
    "Accept-Language": "en-US,en;q=0.8",
    "Cache-Control": "max-age=0",
    "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": "US",
    "Host": "1234567890.execute-api.us-east-1.amazonaws.com",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Custom User Agent String",
    "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)",
    "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==",
    "X-Forwarded-For": "127.0.0.1, 127.0.0.2",
    "X-Forwarded-Port": "443",
    "X-Forwarded-Proto": "https"
  },
  "multiValueHeaders": {
    "Accept": [
      "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
    ],
    "Accept-Encoding": [
      "gzip, deflate, sdch"
    ],
    "Accept-Language": [
      "en-US,en;q=0.8"
    ],
    "Cache-Control": [
      "max-age=0"
    ],
    "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": [
      "US"
    ],
    "Host": [
      "0123456789.execute-api.us-east-1.amazonaws.com"
    ],
    "Upgrade-Insecure-Requests": [
      "1"
    ],
    "User-Agent": [
      "Custom User Agent String"
    ],
    "Via": [
      "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)"
    ],
    "X-Amz-Cf-Id": [
      "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA=="
    ],
    "X-Forwarded-For": [
      "127.0.0.1, 127.0.0.2"
    ],
    "X-Forwarded-Port": [
      "443"
    ],
    "X-Forwarded-Proto": [
      "https"
    ]
  },
  "requestContext": {
    "accountId": "123456789012",
    "resourceId": "123456",
    "stage": "prod",
    "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef",
    "requestTime": "09/Apr/2015:12:34:56 +0000",
    "requestTimeEpoch": 1428582896000,
    "identity": {
      "cognitoIdentityPoolId": null,
      "accountId": null,
      "cognitoIdentityId": null,
      "caller": null,
      "accessKey": null,
      "sourceIp": "127.0.0.1",
      "cognitoAuthenticationType": null,
      "cognitoAuthenticationProvider": null,
      "userArn": null,
      "userAgent": "Custom User Agent String",
      "user": null
    },
    "path": "/prod/path/to/resource",
    "resourcePath": "/{proxy+}",
    "httpMethod": "POST",
    "apiId": "1234567890",
    "protocol": "HTTP/1.1"
  }
}

このコードの7行目に記載されているQueryStringParametersの部分を使います。
8行目("foo": "bar")の部分をinput_textに修正します。

  "queryStringParameters": {
    "input_text": "こんにちは"
  },

修正後、上にスクロールして「保存」をクリックします。
image.png

Lambda関数に戻ります。
input_textの部分にテキストがハードコーディングされているので、この部分を修正します。

import json
import boto3

translate = boto3.client('translate')

def lambda_handler(event, context):
    
    input_text = '私が一番好きなコナン映画は天国への'
    
    response = translate.translate_text(
        Text=input_text,
        SourceLanguageCode='ja',
        TargetLanguageCode='en'
    )

    output_text = response.get('TranslatedText')

    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': output_text   
        }),
        'isBase64Encoded': False,
        'headers': {}
    }

event['queryStringParameters']['input_text']とし、イベントから文字列を受け取れるようにします。

import json
import boto3

translate = boto3.client('translate')

def lambda_handler(event, context):
    
    input_text = event['queryStringParameters']['input_text']
    
    response = translate.translate_text(
        Text=input_text,
        SourceLanguageCode='ja',
        TargetLanguageCode='en'
    )

    output_text = response.get('TranslatedText')

    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': output_text   
        }),
        'isBase64Encoded': False,
        'headers': {}
    }

「Deploy」をクリックし、「Test」をクリックします。
image.png

Lambda関数が実行され、returnが返ってきました。
image.png

上にスクロールして「APIをデプロイ」をクリックします。
image.png

ステージ欄にdevと入力し、「デプロイ」をクリックします。
image.png

URLをコピーします。
image.png

コピーしたURLをブラウザで叩きます。
しかしエラーが返されました。
input_textを渡していないためです。
image.png

URLの後ろに「?input_text=${翻訳したいテキスト}」を入力します。
今回は「お酒を飲みたい」としました。
すると、outputとして、英語に翻訳された文章が表示されました。
image.png

おわりに

最近帰りが遅くなってきて平日にあまりアウトプットできなくなってきましたが、自分のペースで継続していこうと思います。
今度はdynaboDBと連携させていただきです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?