[レポート] サーバーレスアプリケーションにおけるデバッグとデリバリーベストプラクティス #reinvent

2018.12.31

こんにちは、佐伯です。本エントリはre:Invent 2018のセッション「DEV307 -Serverless Application Debugging and Delivery Best Practices」のレポートとなります。

概要

Moving from traditional enterprise applications to serverless applications shouldn’t mean you have to make sacrifices in your development release process. In this talk, we show you how to bring traditional debugging and deployment practices to your AWS Lambda based applications. Using the AWS Cloud9 IDE, we will set breakpoints that enable us to debug our application and follow the call path into the function code. We will install best practices by writing unit tests for our functions and then establish a release pipeline with AWS CodeStar that invokes those tests when we release application into testing or production. We will then use AWS X-Ray to trace and debug our distributed application in production.

スライド

[slideshare id=124641430&doc=serverless-application-debuggi-eafd9a45-a64e-4f4a-aae3-d13821791884-1858730199-181202071819]

レポート

アジェンダ

  • デバッギング
    • 作成方法
    • 開発方法
  • デリバリー
    • リリースプロセス
    • 運用管理

サーバーレスアプリケーションの作成

ファンクション vs アプリケーション

ファンクションはプログラムコードであり、アプリケーションはその他のリソース(API Gateway、IAMなど)を含めた機能そのものです。

AWS SAM

AWS Serevrless Application Model(SAM)はサーバーレスリソースを表現するための単純化された構文を定義し、ネイティブにAWS CloudFormationを使用します。

AWS SAM CLI(Local)

AWS SAM CLIは以下を可能にするコマンドユーティリティです。

  • 新しいアプリケーションの作成
  • ローカル環境でのテスト、デバッグ、分析
  • アプリケーションのデプロイ

AWS SAMのサンプル

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  FunctionName:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: runtime
      CodeUri: s3://bucketname/codepackage.zip

サーバーレスアプリケーションの開発

  • AWS SAM CLI(Local)
    • AWS SAMテンプレートで定義されたサーバーレスアプリケーションをローカルでビルド、テスト、およびデバッグ
    • IDEにローカルデバッグ機能を提供
    • サーバーレスアプリケーションのクラウドホスティングをシュミレート可能
  • ローカルデバッグ
    • AWS Cloud9
    • IntelliJ
    • Eclipse

リリースプロセス

  • リリースパイプラインの定義
    • パイプラインで本番リリースへの過程で起こることを定義する
  • 例:
    • ソースリポジトリのトリガー
    • パイプラインの開始
    • アプリケーションのビルド
    • テストの実行
    • ステージング環境へデプロイ
    • ステージング環境でデプロイ後のテスト
    • 本番環境へのデプロイ

安全なデプロイメントの概要

EC2へのデプロイの場合

  • ALBからデタッチ

  • デタッチしたEC2インスタンスへデプロイ

  • デプロイ後のテスト

  • ALBへアタッチ

  • 上記を繰り返し実行

AWS Lambdaのアップデート

  • AWS Lambdaのエイリアスを使用する

  • AWS LambdaのエイリアスのWeightを更新

  • 新しいバージョンのAWS Lambdaをモニタリング

  • 問題がなければすべてのトラフィックを新しいバージョンを呼び出すようにWeightを更新

参考リンク: エイリアスを使用したトラフィックの移行 - AWS Lambda

運用管理

  • AWS Lambdaコンソール
    • アプリケーションビュー
      • アプリケーションで使用しているすべてのリソースを確認できる
  • Amazon CloudWatch
    • アプリケーションのモニタリング
      • Rawテキストやログの出力
  • AWS X-Ray
    • エンドツーエンドのトレース
      • パフォーマンス分析
      • リクエストフィルタリング(ステータスコードごと、カスタムプロパティなど)
      • アプリケーションの基盤となるコンポーネントのサービスマップ

最後に

私自身インフラ寄りの経験が多く、サーバーレスアプリケーションのデプロイについてあまりイメージができていませんでしたが、AWS Lambdaのエイリアスを利用して新旧バージョンのトラフィックコントロールを行うことができるということが本セッションでの大きな収穫でした。