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

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

ただいまの
回答率

90.75%

  • AWS(Amazon Web Services)

    1830questions

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

  • API

    1420questions

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

  • Cloud9

    384questions

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

  • AWS Lambda

    39questions

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 168

kazuh1r010

score 9

現在、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自体まだまだ初心者の為、他に原因があるかもしれません。
なので、その他の可能性についてのコメントでも構いません。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

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

ソースコードで

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/19 10:52

    回答ありがとうございます。

    こちらの回答のアプローチで対処中、出版社の方から
    修正のコードを教えていただけ、解決できました。

    ただ、AWSでのサーバーレスアプリケーションを開発する上での
    情報は役立ってくると思います。ありがとうございました!

    キャンセル

check解決した方法

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • AWS(Amazon Web Services)

    1830questions

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

  • API

    1420questions

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

  • Cloud9

    384questions

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

  • AWS Lambda

    39questions