前提・実現したいこと
Lambda関数(Node.js、以下Lambda)からEC2インスタンス(以下EC2)上で動いているサービスのREST APIにパブリックIPに解決可能なホスト名で接続したいのですが、ETIMEDOUT
で失敗します。これを成功させたいです。
※Labmdaから別の外部のREST APIへの接続には成功しています。
※EC2の当該REST APIには、自PC等外部からの接続には成功しています。
構成
サービス | VPC | リージョン | Security Group | IPアドレス |
---|---|---|---|---|
Lambda関数 | VPC A | 東京A | SG L(必要なポート上で0.0.0.0をインバウンド許可、アウトバウンドは全て許可) | - |
EC2インスタンス | VPC A | 東京A | SG E(必要なポート上でSG Lをインバウンド許可、アウトバウンドは全て許可) | myHost(1.2.3.4のpublic Elastic IPに解決する) |
発生している問題・エラーメッセージ
Lambdaの実行ログに以下のエラーが発生し、EC2上で動くREST APIへの接続ができませんでした。
なお、別の外部のREST APIへの接続は問題なく成功しました。(公共情報等の自由にアクセス可能なREST API)
↑ごめんなさい!!VPC使ってるときは外部APIにもつながってませんでした!!!間違いでした!!!実際はNAT Gatewayまでのルーティングが正しくなかったです。。。
ERROR Uncaught Exception { "errorType": "Error", "errorMessage": "connect ETIMEDOUT 1.2.3.4:<my port>", "code": "ETIMEDOUT", "stack": [ "Error: connect ETIMEDOUT 1.2.3.4:<my port>", " at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1106:14)" ], "errno": "ETIMEDOUT", "syscall": "connect", "address": "1.2.3.4", "port": <my port> }
該当のソースコード
javascript
1async function test(url) { 2 const https = require('https'); 3 const urlObj = require('url').parse(url); 4 return new Promise((resolve, reject) => { 5 https.get(urlObj, async res => { 6 const { statusCode } = res; 7 const contentType = res.headers['content-type']; 8 9 let error; 10 if (statusCode !== 200) { 11 error = new Error('Request Failed.\n' + `Status Code: ${statusCode}`); 12 } else if (!/^application/json/.test(contentType)) { 13 error = new Error( 14 'Invalid content-type.\n' + 15 `Expected application/json but received ${contentType}` 16 ); 17 } 18 if (error) { 19 console.error(error.message); 20 // Consume response data to free up memory 21 res.resume(); 22 reject(error); 23 } 24 res.on('data', d => resolve(j)); 25 }); 26 }); 27} 28 29exports.handler = async (event, context, callback) => { 30 const url = "https://myHost:port/MYRESTAPI" 31 const val = await test(); 32 console.log(val); 33}; 34
試したこと
- EC2側のSG(SG E)にLambda側のSG(SG L)の許可設定を追加しました。
- 最初はLambdaを非VPCにしていましたが、EC2と同一のVPC上に載せました。
補足情報(FW/ツールのバージョンなど)
- Node.js 10.x
その他必要な情報あれば追記依頼いただければ助かります。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/10/01 06:28
2019/10/01 06:53
退会済みユーザー
2019/10/01 07:02
2019/10/01 07:30
退会済みユーザー
2019/10/01 07:57
退会済みユーザー
2019/10/03 08:14