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

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

新規登録して質問してみよう
ただいま回答率
85.35%
AWS Lambda

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

AWS(Amazon Web Services)

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

Q&A

解決済

2回答

2247閲覧

CloudFormationを利用して、APIGatewayとLambda関数を紐づける

te_ff

総合スコア13

AWS Lambda

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

AWS(Amazon Web Services)

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

0グッド

1クリップ

投稿2021/06/23 09:13

編集2021/06/24 01:37

前提・実現したいこと

AWSにて、APIServerを構築しています。
Lambda関数リクエスト時には問題ないのですが、Lambda関数レスポンス時にCORSではじかれる状況です。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-gatewayresponse.html

こちらを参考にCloudFormationで管理しようと思ったのですが、

・Lambda関数の紐づいたstack-nameで指定した名前のAPIGateWay(hogehogeapi)
・CloudFormationに記載されている空のAPIGateway(myRestApi)

二つが作成され、うまく紐づきません。

どのようにすれば、紐づけができるのでしょうか?

また、レスポンス時に下記記載するとできるかと思うのですが、すべてのLambda関数に記載するのであればできればCloudFormationに記載して管理したいと思っております。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-cors.html

'headers': { 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Origin': 'https://www.example.com', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET' },

実行したコマンド

sam build -t backend/template.yaml sam deploy --template-file .aws-sam/build/template.yaml --stack-name hogehogeapi

該当のソースコード

yaml

1[template.yaml] 2AWSTemplateFormatVersion: "2010-09-09" 3Transform: AWS::Serverless-2016-10-31 4Description: > 5 test 6 7 Sample SAM Template for test 8 9# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst 10Globals: 11 Function: 12 Timeout: 3 13 Api: 14 Cors: 15 AllowMethods: "'GET,POST,OPTIONS,DELETE,PUT'" 16 AllowHeaders: "'content-type'" 17 AllowOrigin: "'*'" 18 AllowCredentials: "'*'" 19 20Resources: 21 MyBucket: 22 Type: AWS::S3::Bucket 23 BucketName: test-bucket 24 25 RestApi: 26 Type: AWS::ApiGateway::RestApi 27 Properties: 28 Name: myRestApi 29 30 GatewayResponse: 31 Type: AWS::ApiGateway::GatewayResponse 32 Properties: 33 ResponseParameters: 34 gatewayresponse.header.Access-Control-Allow-Origin: "'*'" 35 gatewayresponse.header.Access-Control-Allow-Headers: "'*'" 36 ResponseType: MISSING_AUTHENTICATION_TOKEN 37 RestApiId: !Ref RestApi 38 StatusCode: "404" 39 40 CreateProjectFunction: 41 Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction 42 Properties: 43 CodeUri: lambdas/create_project/ 44 Handler: app.lambda_handler 45 Layers: 46 - arn:aws:lambda:ap-northeast-1:898466741470:layer:psycopg2-py38:1 47 Runtime: python3.8 48 Events: 49 CreateProject: 50 Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api 51 Properties: 52 Path: /create_project 53 Method: POST

捕捉

RestApiからAPIに変更し、Function>Events>Propertiesに RestApiId: !Ref ApiGatewayApi を追加すると紐づけ自体は行われているのですが、Corsの設定がうまくできていないようです。

参考
・RestAPI
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html

・API
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-api.html

・Function>Events>Properties>Api
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-property-function-api.html

...省略 ApiGatewayApi: Type: AWS::Serverless::Api Properties: StageName: Prod Cors: "'*'" GetProjectFunction: Type: AWS::Serverless::Function Properties: CodeUri: lambdas/get_project/ Handler: app.lambda_handler Layers: - arn:aws:lambda:ap-northeast-1:898466741470:layer:psycopg2-py38:1 Runtime: python3.8 Events: GetProject: Type: Api Properties: Path: /get_project Method: get RestApiId: !Ref ApiGatewayApi ...省略

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

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

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

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

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

guest

回答2

0

自己解決

Type: AWS::Serverless::Apiを作成し、
Type: AWS::Serverless::Function > Properties > Events > Function名 > Properties > RestApiIdにて記載すると対応できました。

投稿2021/10/05 03:33

te_ff

総合スコア13

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

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

0

CreateProjectFunction の CreateProject イベントのプロパティに以下を追記してみてください。

yaml

1RestApiId: !Ref RestApi

投稿2021/06/23 10:58

yh1224

総合スコア653

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

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

te_ff

2021/06/24 01:10

ご回答ありがとうございます! 対応してみたのですが、エラーが発生しました。 ``` InvalidResourceException('GetProjectFunction', 'property RestApiId not defined for resource of type AWS::Serverless::Function' ``` また、公式ドキュメントも見てみたのですが該当するようなPropertiesは存在しなかったです。。。 https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-function.html
te_ff

2021/06/24 01:13

コードの記載漏れていました ``` GetProjectFunction: Type: AWS::Serverless::Function Properties: CodeUri: lambdas/get_project/ Handler: app.lambda_handler Layers: - arn:aws:lambda:ap-northeast-1:898466741470:layer:psycopg2-py38:1 RestApiId: !Ref RestApi Runtime: python3.8 Events: GetProject: Type: Api Properties: Path: /get_project Method: get ```
te_ff

2021/06/24 01:37

すみません。 記載箇所が間違っていたようです。 捕捉に情報追加いたしましたのでよろしければご確認お願いいたします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問