2017-09-12 5 views
1

JS AWS Lambdaをローカルで実行して単体テストしようとしています。ラムダ環境をエミュレートするために、私はLambdaがAWS.config.credentialsで持っていたのと同じ役割を引き受けており、必要なものをインポートしたラムダ関数を呼び出すだけです。インポートされたモジュールにAWS設定を渡す

ラムダ関数をコピーしてテストファイルに貼り付けると機能しますが、インポートすると、設定がないクリーンなAWS.configで関数が実行されているようです。テストから設定を取得するためにLambdaモジュールがAWSをインポートする方法(グローバルにするか他に何かを行う)を変更することができましたが、ラムダにアップロードするためにファイルをそのまま保存することをお勧めします。

AWS LambdaではAWSの認証情報が何らかの形で事前に設定されているため、モジュールは何もする必要がなく、その機能をエミュレートしたいと思います。どのようにNodeでこれを行うことができますか?

EDIT: AWSラムダで任意のサンプル関数を実行できます。たとえば、次のコードは、適切なAWS Lambdaで実行された場合にのみ動作します。次にこのコードの前に持ってローカルでこれを実行するには

var AWS = require("aws-sdk"); 
 
var dynamo = new AWS.DynamoDB.DocumentClient(); 
 
dynamo.query(...)

AWS.config.update({region: 'us-east-1'}); 
 
AWS.config.credentials = new AWS.SharedIniFileCredentials(); 
 
AWS.config.credentials = new AWS.TemporaryCredentials({ 
 
    RoleArn: 'arn:aws:iam::1234567890:role/TemporaryCredentials', 
 
});

問題は、この設定手順を実行しているということですユニットテストファイルでは、インポートされたラムダファンクションで設定を利用できないしたがって、環境を正しくエミュレートしません。

+0

どのように事前設定されていますか?関連するコードをラムダで表示できますか? –

+0

実際のラムダ環境で動作している間にaws-sdkから何かにアクセスすると、ラムダの役割の証明書を入手するだけで、ラムダの役割を果たすことができます。私がこれをエミュレートするために考えられる唯一の方法は、AWSオブジェクトを設定することです。 – Gerharddc

+0

どこかに設定する必要があります。私たちにコードを教えてください。 –

答えて

1

私の解決方法はjestです。あなたが他のテストフレームワークにそれを適用できることを確かめてください。私はちょうどそれがjestで簡単だと思う。

基本的に、あなたは実際のaws-sdkモジュール独自の修正を返すaws-sdkモジュールのモックを作成します。これにより

// __mocks__/aws-sdk.js (Jest automocks this module if you follow this convention) 
'use strict'; 

const AWS = require('AWS'); 


// Make your own modifications 
AWS.config.update({region: 'us-east-1'}); 
AWS.config.credentials = new AWS.SharedIniFileCredentials(); 
AWS.config.credentials = new AWS.TemporaryCredentials({ 
    RoleArn: 'arn:aws:iam::1234567890:role/TemporaryCredentials', 
}); 


//export modified module 
module.exports = AWS 

あなたのラムダはaws-sdkを必要とするとき、それは代わりにこのモジュールをロードします。実際のaws-sdkモジュールと追加の設定が付属しています。

参考:https://facebook.github.io/jest/docs/en/manual-mocks.html#content

+0

私はjestを使用していますが、実際にはprocess.envオプションよりもうまく機能するかもしれませんが、動作するかどうか確認します – Gerharddc

1

テストを実行する前に、STS.AssumeRoleを呼び出して一時的な資格情報を取得し、それらを環境に配置する必要があります。それがラムダがそれをするように見える方法です。サービスはAssumeRoleを呼び出し、一時的な資格情報を取得し、SDKが要求する場所にそれらを配置します。

AWS_ACCESS_KEY_ID 
AWS_SECRET_ACCESS_KEY 
AWS_SESSION_TOKEN 

あなたが実行しているラムダ関数でprocess.envを調べる場合は、これらの変数が設定されていることがわかります。

http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-environment.html

私が言うことに注意してください「あなたはあなたのテストを実行する前に、」あなたがすべてでそれを開始する前に、私は意味 - ないコードの先頭にあります。

また、アクセスキーとシークレットは、IAMクレデンシャルのものではありません。 AssumeRoleを呼び出すと、一時キー、一時的な秘密、および一時的なトークンが提供されます。

+0

しかし、これらの資格情報は一時的なものなので、かなり定期的に取り戻す必要がありますか? 1つのjsファイルに別の環境を設定する前に環境を設定する方法はありますか? – Gerharddc

+0

ロールが実際にAWS.Config上のaccessKeyIdとsessionTokenに値を設定しないと仮定し、AWS_SECRET_ACCESS_KEYの読み取り可能なフィールドを持っていないようです。 – Gerharddc

+0

['assumeRole'](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/STS.html#assumeRole-property)を参照してください。資格情報の有効期間は最大1時間です。これらの値を取得し、それらを環境変数に取り込む必要があります。 –

関連する問題