LoginSignup
3
2

More than 5 years have passed since last update.

AWS X-Ray を使っていると aws-mock から`Service.prototype.customizeRequests is not a function`と怒られる件

Last updated at Posted at 2018-11-02

問題

aws-mockaws-xray-sdk に対応していないらしく、captureAWS で XRay 関連の関数を呼び出そうとした時点で以下のようなエラーが出てしまいます。

/project/dir/node_modules/aws-xray-sdk-core/lib/patchers/aws_p.js:37
      Service.prototype.customizeRequests(captureAWSRequest);
                        ^

TypeError: Service.prototype.customizeRequests is not a function

どちらも、元の関数を別の処理に置き換える/処理を差し込むということを目的としているものなので競合は当然かもしれません。

とりあえずの対処

テスト時には X-Ray不要なので、それらをコメントアウトするなりで無効化すれば良いのですが、いちいちソースコードを書き換えるのは面倒です。

そこで、aws-xray-sdk の読み込みを動的に切り替えるモジュールを作成します

my-xray.js
module.exports = (function () {
  if (process.env.DISABLE_XRAY) {
    // 環境変数 DISABLE_XRAY が定義されている場合、以下の mock オブジェクトを返す
    const mock = {
      captureAWS (obj) {
        return obj
      },
      captureAsyncFunc (segmentName, asyncFunc) {
        const mockSubSegment = {
          close () { /* do nothing */ }
        }
        asyncFunc(mockSubSegment)
      }
    }
    return mock
  } else {
    // 環境変数が定義されていない場合は通常通り aws-xray-sdk を読み込んで返す
    return require('aws-xray-sdk')
  }
})()

これまで aws-xray-sdk パッケージを require していた箇所では代わりに my-xray を require するように修正します。

- const awsXRay = require('aws-xray-sdk')
+ const awsXRay = require('./my-xray')
const AWS = awsXRay.captureAWS(require('aws-sdk'))

これで、mochaなどでテスト実行する際に環境変数を設定してあげれば X-Ray が無効化された状態でテストが実行できます。

$ DISABLE_XRAY=1 yarn run mocha
3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2