Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

問題

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
snaka
VB,Java,.NET,Unity(C#)とやってきて、今はRubyときどきJavaScriptでサーバサイド中心。2020年は Go言語, TypeScript やっていきたい。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした