はじめに
こんにちは。
今回はAPI Gateway、Lambda、Translateを連携させてみました。
本記事は以下記事の続編です。
↓参考にしたハンズオンはこちら。
やってみた
マネジメントコンソールにアクセスし、API Gatewayのページにアクセスします。
前回作成したtranslate-apiをクリックします。
リソース名はtranslateとして「リソースを作成」をクリックします。
メソッドタイプは「GET」、Lambda関数と連携するので、統合タイプは「Lambda統合」、「Lambdaプロキシ統合」をONにし、Lambda関数には「translate-function(Translateを呼び出す関数)」を指定します。
URLクエリ文字列パラメータをクリックし、「クエリ文字列を追加」をクリックします。
「Lambda統合」をクリックし、「translate-function」をクリックします。
Lambdaのページが別タブで開きます。
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を選択します。
以下がそのテンプレートです。
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": "こんにちは"
},
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」をクリックします。
コピーしたURLをブラウザで叩きます。
しかしエラーが返されました。
input_textを渡していないためです。
URLの後ろに「?input_text=${翻訳したいテキスト}」を入力します。
今回は「お酒を飲みたい」としました。
すると、outputとして、英語に翻訳された文章が表示されました。
おわりに
最近帰りが遅くなってきて平日にあまりアウトプットできなくなってきましたが、自分のペースで継続していこうと思います。
今度はdynaboDBと連携させていただきです。