[re:Invent2019] [レポート] WIN308 – Developing serverless .NET Core on AWS #reinvent

2019.12.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

クラスメソッドに転職してからはコードを書くことがめっきり減ってしまったのですが、以前はVB.NETやC#を使ってアプリケーションを開発する.NETなプログラマーでもありました。
割とレガシーな自分の知識をアップデートさせるためにこのセッションに参加してみました。

セッション概要

In this demonstration-heavy session, we highlight the latest techniques, tools, and libraries for developing with .NET Core on AWS. The focus is on serverless applications with AWS Lambda and AWS Fargate, but the techniques are broadly relevant. Learn about useful features and best practices for authoring serverless applications, including debugging locally from the IDE and in production, as well as how to set up your CI/CD workflow from the start.

  • Norm Johanson - Senior Software Developer, Amazon Web Services
  • Steve Roberts - Senior Technical Evangelist, Amazon Web Services

配信動画

Agenda

アジェンダはこんな感じ。

私は今回がre:Invent初参加だったので知らなかったのですが、去年も同様のセッションがありCloudMosaicというデモアプリケーションを紹介していたそうです。
このセッションではそのCloudMosaicアプリケーションを2019年度版にし、去年からの更新点をメインに解説する内容となっています。

去年の動画

ちなみに去年のセッション動画はこちらになります。

(re:Invent 2018 : DEV318 - Developing with .NET Core on AWS: What's New)

What's new for .NET development on AWS

最初に.NET開発者向けの最新情報として以下の3点が紹介されました。
セッションでも軽く触れるだけだったので詳細は以下のリンクから確認してみてください。

CloudMosaic 2019 Edition

ここからがセッションの本題です。
CloudMosaicアプリケーションはGitHubでソースが公開されています。

READMEを見るとWindows環境ではVisual Studio 2019 + .NET Core SDK 2.1、macOS/Linux環境では.NET Core SDK前提となっており、ソース自体はワークショップ形式で順にコンパイルからデプロイまを進めることができる様になっています。

あとは実際にソースを動かしてみるのが一番良いと思います...がそれだとレポートとしてはダメダメかと思いますのでざっくりセッション中解説したポイントをまとめておきます。

ブランチについて

re:Invent 2019ではreinvent-2019ブランチのソースを使用しています。
セッション動画を見ながら作業する場合はブランチを切り替えておくと良いでしょう。

※このブランチでは.NET Core 3.1 SDKが必要です。

CloudMosaicアプリケーションについて

このCloudMosaicはあらかじめ登録されている画像(Tile gallery)を元に指定された画像(Original image)のモザイクアート(Mosaicked image)を生成するアプリケーションです。

大きく3つのサブシステムに分かれておりそれぞれ様々なAWSサービスが使われています。

  • Gallery登録部分
    • S3
    • AWS Batch
    • Lambda
    • DynamoDB
    • Rekognition
  • モザイクアートのレンダリング
    • S3
    • Step Functions
    • Lambda
  • WEBフロントエンド
    • Fargate
    • Cognito
    • SSM Paramter Store

Gallery登録部分での処理について

  • Zipファイルを解凍しその中にある画像をS3に登録するコンソールアプリ
  • S3へのアップロードイベントをトリガーにLambdaが起動
    • Lambdaで画像の各種情報を取得し、DynamoDBにメタデータとして登録
  • パフォーマンスの問題を解消するためにLambdaでバッチ処理?
  • パラメーターはSSM Parameterに登録

モザイクアートのレンダリング処理について

  • Step Functionsのエラーハンドリングを改善
    • "UNWRAP_AGGREGATE_EXCEPTIONS" 環境変数 : "true"
  • Amazon.Lambda.Serialization.Json.JsonSerializer シリアライザ
  • メモリサイズが異なる3つのレンダラーを用意し、OutOfMemoryの際により大きなメモリサイズのレンダラーにフォールバックさせている

WEBフロントエンドについて

最後に

ざっとこんな感じです。

アプリケーションとしては単純に見えるものの使われているAWSサービスはてんこ盛りで勉強になります。
まだ実環境を作って試せていないのですがちゃんと試してキャッチアップしていきたいです。

おまけ : Normさんが使ってたツール

コードの説明はNormさんがメインで行っており、おまけとしてNormさんが使っていたツールを分かる限りで紹介します。

  • Visual Studio 2019 + AWS拡張
    • こちらは最初に説明した要件の通りです
  • TortoiseGit
  • Microsoft Terminal
  • PowerShell Core 6.2.3 + posh-git
    • TortoiseGitとposh-gitを併用している風でした