Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@snaka

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

問題

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
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
2
Help us understand the problem. What are the problem?