.NET on AWS の無料のセルフペースデジタルコースでデジタルスキルバッジを手に入れてみた

2022.12.31

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

いわさです。

re:Invent 2022 後から年末にかけて .NET on AWS 関連の情報を調べていました。

その中で .NET on AWS に関する無料のセルフペースデジタルコースが提供されていることを知りました。
ちょうど年末年始は ECS on Fargate の学習をしたかったなぁと思ったので、良い機会と思いこちらのデジタルコースを実施してみましたので紹介します。

3 つのコースがある

デジタルコースへは以下からアクセスが可能です。
認証不要で無料で利用が可能です。

本日時点でコースは以下の 3 つが提供されています。

App Runner と Lambda への .NET アプリのデプロイに比べて ECS on Fargate へのデプロイは余り触ってこなかったので今回は ECS on Fargate のコースを実施してみることにしました。

.NET Workloads - Amazon ECS on AWS Fargate

このコースは 4 つのモジュールで構成されており、前半の 2 つで ECS に関する知識と ECS へ .NET アプリをデプロイするためのツール関係の知識について学習します。
3 つ目で実際に ASP.NET Core アプリを使って ECS クラスターを構成するハンズオンを実施します。
そして最後にスキルアセスメントを行い、80% 以上のスコアを獲得出来るとバッジをゲット出来ます。

コースの実施時間は 3 時間とされていますが、座学部分やハンズオン部分は必須ではありません。
習熟している部分についてはさらっと流すくらいでも良いと思いますし、そのように書いてあります。

各モジュールの最後に数問のナレッジチェックが用意されています。

モジュール 1 : ECS に関する座学

初めに ECS について学びます。
ここでは以下について学習することが出来ます。

実際に本編を見て頂ければ良いかなと思うので、この記事では学べることを俯瞰出来るように整理だけします。
さらに、関連する DevIO 記事をリンクしておくことで補足資料として使えるようにしておきたいと思います。コンテンツが英語なのでわかりにくいときは DevIO 記事も見てみてください。

なお、EKS についてはこのモジュールでは登場しません。

モジュール 2 : ECS + .NET on AWS 関係のツール

モジュール 1 で ECS について学びました。
モジュール 2 では .NET アプリケーションをどのように ECS へ統合させることが出来るのか、各種ツールが提供されているのでそれらについて学習します。

.NET と .NET Framework どちらもカバーされています。
ツールについても Windows であれば AWS Toolkit for Visual Studio、クロスプラットフォームであれば dotnet CLI 拡張機能が紹介されています。
レガシーアプリケーションのモダナイズやコンテナ化についてのツールはこのデジタルコースでは登場しません。

上記のうちAmazon.ECS.Toolsについてはこのデジタルコースで初めて知りました。
AWS.Deploy.Toolと少し機能が重複していそうですが、専用パッケージが存在していたとは。

モジュール 3 : ハンズオン

このモジュールでは、モジュール 1 とモジュール 2 で習得した知識をベースに実際にハンズオンを実施します。
以下の構成の .NET 製の Web アプリケーションをデプロイします。

Module Three - .NET Workloads on Amazon ECS and AWS Fargate より引用

実施環境は Windows, macOS, Linux いずれでも良いとのことで、Cloud9 で実施する手順も案内されています。
私は macOS で実施しました。

流れとしては、dotnet newコマンドを使ったあとに少しコードを修正してからツールでデプロイする形になっています。
このあたりは手順どおり実施するだけなのでハンズオンコンテンツを参照ください。

私はいくつか躓いて、かつ問題が未解決なのですがいくつか気をつける点を共有しておきます。

DynamoDB へテストデータ追加時に DynamoDB JSON オプションを ON にする

ハンズオン手順のテストデータ形式は DynamoDB JSON になっています。
手順でここは明記されてなかったですが以下のオプションを ON にします。デフォルトは OFF です。

DynamoDB テストデータの 2 件目が誤っている

こちらは然るべきフィードバックをしたいと思いますが、テストデータが 1 件目と同じでおそらく誤っていると思いますので以下のようなエラー画面になると思います。

正しくは以下です。

{
  "Location": {
    "S": "Dallas"
  },
  "Timestamp": {
    "S": "2022-07-23T12:00:00"
  },
  "Summary": {
    "S": "Scorching"
  },
  "TempC": {
    "N": "43"
  },
  "TempF": {
    "N": "109"
  }
}

Controller のコードがビルドエラー発生する

WeatherForecastController にいくつか変更を加えるのですが、ハンズオン手順だとディクショナリの型が指定されていなかったり DI されたロガーの形式が一致していなかったりしました。
私は、こうかなぁという感じで以下のように修正してみました。
一応これでその後のローカルテスト実施時には期待どおり動作しています。

Controllers/WeatherForecastController.cs

using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DocumentModel;
using Microsoft.AspNetCore.Mvc;

namespace WeatherAPI.Controllers;

[ApiController]
[Route("")]
public class WeatherForecastController : ControllerBase
{
    static readonly RegionEndpoint region = RegionEndpoint.APNortheast1;

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet("")]
    public string GetHealthcheck()
    {
        return "Healthcheck: Healthy";
    }

    [HttpGet("WeatherForecast")]
    public async Task<WeatherForecast[]> GetWeatherForecast(string location = "Dallas")
    {
        List<WeatherForecast> forecasts = new List<WeatherForecast>();

        try
        {
            _logger.LogInformation($"00 enter GET, location = {location}");

            var client = new AmazonDynamoDBClient(region);
            Table table = Table.LoadTable(client, "Weather");

            var filter = new ScanFilter();
            filter.AddCondition("Location", ScanOperator.Equal, location);

            var scanConfig = new ScanOperationConfig()
            {
                Filter = filter,
                Select = SelectValues.SpecificAttributes,
                AttributesToGet = new List<string> { "Location", "Timestamp", "TempC", "TempF", "Summary" }
            };

            _logger.LogInformation($"10 table.Scan");

            Search search = table.Scan(scanConfig);

            List<Document> matches;
            do
            {
                _logger.LogInformation($"20 table.GetNextSetAsync");
                matches = await search.GetNextSetAsync();
                foreach (var match in matches)
                {
                    forecasts.Add(new WeatherForecast
                    {
                        Location = Convert.ToString(match["Location"]),
                        Date = Convert.ToDateTime(match["Timestamp"]),
                        TemperatureC = Convert.ToInt32(match["TempC"]),
                        TemperatureF = Convert.ToInt32(match["TempF"]),
                        Summary = Convert.ToString(match["Summary"])
                    });
                }
            } while (!search.IsDone);

            _logger.LogInformation($"30 exited results loop");

        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "90 Exception");
        }

        _logger.LogInformation($"99 returning {forecasts.Count} results");

        return forecasts.ToArray();
    }
}

ただし、その影響なのか ECS へデプロイ後にタスクが起動後にすぐ終了される状態が繰り返されてしまい、今も調査中です。

モジュール 4 : スキルアセスメント

モジュール 3 が正常に終わってないですが、モジュールの実施状況に関わらずスキルアセスメントを実施することが出来ます。
選択式で問題が出題され 80 % 以上のスコアで合格です。

不合格でも何度でも受けることが出来る緩い感じです。
ただ、同じ問題が出るわけではないので一定の理解度は求められます。

合格するとデジタルスキルバッジを取得出来ます。
スキルアセスメント開始時に名前とメールアドレスを入力することで Credly と紐付けることが出来ます。反映までタイムラグがあるようです。

さいごに

本日は .NET on AWS の無料のセルフペースデジタルコースでデジタルスキルバッジを手に入れてみました。

.NET on AWS に興味のある方はぜひ挑戦してみてください。
.NET アプリケーションは開発出来るがどう AWS へデプロイしたら良いのか...という方に最適なデジタルコースだと思います。
Credly のデジタルスキルバッジももらえるのでバッジを集めている方も如何でしょうか。