質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2619閲覧

API Gatewayに AWS CLI で POSTしたとき、エラーが発生して実行できない

kazuh1r010

総合スコア23

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2018/04/17 12:56

編集2018/04/18 04:34

現在、APIを作成したいと思い、本を参考にサンプルを作成しているところです。

開発環境は、cloud9で
参考にしている本は、
「AmazonWebServicesを使ったサーバーレスアプリケーション開発ガイド(https://www.amazon.co.jp/dp/B07BF4G5C1/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)」
です。

その中で、デプロイしたAPIに対してリクエストをするコマンドが
あるのですが、エラーの内容が抽象的で何が原因か突き止められませんでした。

コードは、以下の様になっています。

curl -X POST https://(API.ID部分).execute-api.ap-southeast-1.amazonaws.com/Prod/images

エラーメッセージは、以下の様になっています。

{"message": "Internal server error"}

lambda関数のコード(これが原因の可能性もあるので)

import boto3 import uuid import json import logging import os import datetime from botocore.exceptions import ClientError logger = logging.getLogger() logger.setLevel(logging.INFO) dynamodb = boto3.resource('dynamodb',region_name = 'ap-southeast-1') table = dynamodb.Table(os.getenv('TABLE_NAME')) def generate_id(): return str(uuid.uuid4()) def get_timestamp(): now = datetime.datetime.utcnow() return int(now.timestamp()) def get_presigned_url(bucket_name, key, type): s3 = boto3.client('s3', region_name = "ap-southeast-1") url = s3.generate_presigned_url( ClientMethod = 'put_object', Params = {'Bucket' : bucket_name, 'Key' : key, 'ContentType' : type}, ExpiresIn = 3600, HttpMethod = 'PUT', ) return url def lambda_handler(event, context): body = json.loads(event['body']) ext = body['type'].split('/')[1] photo_id = generate_id() logger.info(photo_id) logger.info(ext) logger.info(body['type']) url = get_presigned_url(os.getenv('BUCKET_NAME'),photo_id + "." + ext,body['type']) item = { 'photo_id': photo_id, 'timestamp': get_timestamp(), 'status' : 'Waiting', 'type' : body['type'], 'size' : body['size'] } try: table.put_item( Item = item ) except ClientError as e: logging.info(e.response['Error']['Message']) response = { 'statusCode': '400', 'body': e.response['Error']['Message'], 'headers': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin' : '*' }, } return response else: item['signed_url'] = url response = { 'statusCode': '200', 'body': json.dumps(item), 'headers': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin' : '*' }, } return response

AWS自体まだまだ初心者の為、他に原因があるかもしれません。
なので、その他の可能性についてのコメントでも構いません。

どなたか解決方法が分かる方いらっしゃいましたら、
ご教授よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

AWSでサーバーレスアプリケーションを開発するときは、たいてい、Lambda のログを CloudWatch Logs というサービスに出力するよう設定します。
その書籍の目次でも CloudWatch が触れられているようので、おそらく設定済みかと思います。

ソースコードで

python

1 logger.info(photo_id) 2 logger.info(ext) 3 logger.info(body['type'])

などとログ出力用コードが書かれています。もし Lambda と CloudWatch がちゃんと設定されていれば、この ログ出力結果が CloudWatch Logs に記録される、という仕組みです。

ですので、次のように進めていくとよいかと思います。

  1. CloudWatch Logsに記録されたログを見つけてて、Lambdaのどこでエラーになっているか調べてみる。
  2. もしエラーが分からなければ、ログを増やして、どこまで成功してそうかを調査する。

投稿2018/04/18 08:55

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuh1r010

2018/04/19 01:52

回答ありがとうございます。 こちらの回答のアプローチで対処中、出版社の方から 修正のコードを教えていただけ、解決できました。 ただ、AWSでのサーバーレスアプリケーションを開発する上での 情報は役立ってくると思います。ありがとうございました!
guest

0

自己解決

解決ができずにいたので、ダメ元ながら出版社に問い合わせたところ
コマンドが間違っていたようで、修正したところ、実行出来るようになりました。
同じ悩みを抱えている方がいらっしゃる可能性を考えて、記載しておきます。

修正後は以下の様になります。

$ curl -X POST https://ID部分.execute-api.ap-northeast-1.amazonaws.com/Prod/images -d '{"type":"image/jpeg","size":1}'

投稿2018/04/19 01:48

kazuh1r010

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問