Serverless Frameworkで作ったLambdaにX-Rayのアクティブトレースを適用する


X-rayがついにLambdaサポートしましたね。
まだプレビュー版ということもあり、CloudFormationではLambdaにX-Rayのアクティブトレースを設定する定義は追加されていない様子です。
そのためCloudFormationを利用しているServerless FrameworkでもまだX-Rayを利用することはできないのですが・・・

まぁ待てないですよね。

ということで手作業交えて設定してみました。

事前準備

LambdaからX-Rayにデータを送信するためのiamRoleStatementsが必要になります。
serverless.ymlに書き足しておきましょう。

serverless.yml
provider:
  name: aws
  runtime: nodejs4.3
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "xray:PutTraceSegments"
        - "xray:PutTelemetryRecords"
      Resource:
        - "*"

デプロイしたLambdaに手作業でX-Rayを設定する

デプロイ後にAWSのマネージドコンソールからX-Rayの設定を有効化していきます。
Lambdaの場合はX-Rayの管理画面ではなく、Lambdaの管理画面側から設定するのでご注意ください。


「アクティブトレースを有効にする」をオンにして保存します。

「Lambdaの数が多いので手作業はつらい」という方は、AWS-CLIを使いましょう。

update-function-configurationTracingConfigを使えばいけるっぽいです(未検証)

Lambdaの実行結果を見る

ここまでやれば、あとはX-Rayがよしなにしてくれます。

チェックボックスのオンオフだけで設定できるので、気軽に試せて気軽に止めれるのがいいですね。

Tips:sls deployで衝突しないか?

CloudFormationで定義した内容を手動で設定変更していますが、今のところsls deployでの更新も問題なくできる様子です。

CloudFormationがLambda - X-Rayをサポートした時にどうなるかはわかりませんが、最悪一度X-Ray連携を全て切ってからServerless Framework側で再設定する必要がでてくるかもしれません。

Tips:sls removeはこける

IAMRoleをX-Ray側でも使用する(?)からか、sls removeはこけます。

$ sls remove --stage xraytest --profile static
Serverless: Getting all objects in S3 bucket...
Serverless: Removing objects in S3 bucket...
Serverless: Removing Stack...
Serverless: Checking Stack removal progress...
...............................................................................................................................................................................................................................................................Serverless: Deployment failed!

  Serverless Error ---------------------------------------

     An error occurred while provisioning your stack: IamRoleLambdaExecution
     - Cannot delete entity, must detach all policies first..

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Forums:        forum.serverless.com
     Chat:          gitter.im/serverless/serverless

  Your Environment Information -----------------------------
     OS:                 darwin
     Node Version:       7.4.0
     Serverless Version: 1.10.1

AWSコンソールからCloudFormationの画面に移動して、スタック削除をリトライしましょう。

現場からは以上です。