5

私は2つのサービス(それぞれの従来のAPIと同じように、エンドポイントが定義された複数の機能を持つ 'ユーザー'と '製品')を使用すると、コードベースで分けることができます(分かりやすくするために)。しかし、一度配備すれば同じAPIベースのURLを共有できますか?サーバレスフレームワーク - 1つのAPIGWエンドポイントで2つのサービスを提供

/src 
-- /users 
---- event.json 
---- handler.js 
---- serverless.yml 
-- /products 
---- event.json 
---- handler.js 
---- serverless.yml 

と私src/users/serverless.ymlは以下の通り定義されています:

functions: 
    create: 
    handler: handler.create 
    events: 
     - http: POST user 

    read: 
    handler: handler.read 
    events: 
     - http: GET user 

と私のsrc/products/serverless.ymlは基本的に同じものがあり、単に「製品」の「ユーザー」を入れ替える例えば、私は次のような構造を持って考えます。現在

、これらのサービスの両方がhttps://abcdevwxyz.execute-api....

私の質問は、これらのサービスを展開することは可能であってもよいが残る、あるURLでの明らかに異なるAPIエンドポイント、URL https://fghijklmnop.execute-api...と1と別の展開されます1つのURLを持つ単一のAPIの下で(両方ともURL https://abcdevwxyz.execute-api....で提供されます)?

私は答えは「いいえ、雲の形成のため...」と思っていますが、ここでは単に議論のために質問を投稿し、サーバーレスアプリケーションを構築するための自分の理解を助けると思っていました。

the answer hereのようにカスタムドメインを使用していることがわかりましたが、これは開発サイクルが短くても理想的なソリューションではありません。

私の唯一の解決策は、私のAPIが必要とするすべてのエンドポイントを含む 'api'というサービスを単に作成することです。これは以前設定されたエンドポイントではなく直接他のサービスのラムダ関数を呼び出します。それは抽象レイヤーですが、不要なレイヤーをアプリケーションに追加する可能性があります。再び、コミュニティがこれについて何を感じているのかを知りたい。

答えて

0

私はこの問題に対する私自身の解決策を思いつきました。イベントに応答してそれらのイベントを処理し、それらを個別のマイクロサービスに委譲する特定の統合サービス(API、S3、SNSなど)を持つように、アプリケーションの統合ポイントを抽象化しました。コード例を使ってarticleを書きました。

1

あなたは1 serverless.yml

/src 
-- event.json 
-- users.handler.js 
-- products.handler.js 
-- serverless.yml 
+0

これは当てはまりますが、これらのサービスは緊密に連携しており、常に展開して管理する必要があります。サービスをはっきりと区別して(ただしAPIレイヤーを介して)リンクしたい場合は、これは機能しません。たとえば、サービス名は同じでなければなりません。 –

1

私はサーバレスフレームワークのサポートに直接話すことができないで複数の機能を置くことができますが、これは、APIゲートウェイには確かに可能です。

各「サブAPI」ごとに複数のSwaggerファイルを維持し、import?mode = mergeを使用して両方の定義を同じAPIにインポートすることができます。

カスタムドメイン名を使用することができます http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-import-api.html

おかげで、 ライアン

0

を参照してください:http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

セットアップカスタムドメイン名(SSL証明書が必要です)http://myapi.com/

をapisをマップします:

http://myapi.com/users 
http://myapi.com/products 

ただ、このようなあなたの関数を呼び出す:

http://myapi.com/users/create 
http://myapi.com/users/read 
http://myapi.com/products/whaterver 
+0

私の質問によると、これはスムーズな開発には適していないので、私は本当にこれに代わるものを探しています。私は今すぐドメインを登録する準備ができていません。 –

1

私は自分のコードで何をやったかはhandler.jsファイルのうち、すべてのコードを引っ張るとモジュール内に置くことです。これらのモジュールはhandler.jsファイルに必要となり、単純な関数が呼び出されます。

usersModule.js:

export const doSomething =() => { 
    // Do something here. 
}; 

ユーザー/ handler.js:あなたはそれを持ってしたいところはどこでも

import {doSomething} from '../.../usersModule.js'; 

export const handler = (event, context, callback) => { 
    doSomething(); 
    // Do other stuff... 
    callback(null, "Success"); 
}; 

この方法では、あなたのコードの肉を置くことができますが、何に整理します方法はあなたに意味をなさない。

ただし、依然として単一のAPIを定義する必要があります。または、RyanG-AWSの回答を使用してAPIをマージします。


コードとAPIの定義を別々にしたい場合は、ユーザーAPIと製品APIを別々に作成できます。これらのAPIのいずれかを呼び出す別のAPIを組み合わせることになります。このようにして、単一のベースURLを持つ単一のサービスを呼び出すことになります。これは統合タイプのHTTPで行うことができます。私はこれを試していないので、どれくらいうまくいくか分かりません。

関連する問題