GS2 Blog

Game Server Services(https://gs2.io/) の最新情報をお届けします

AWS Lambda の go 1.x サポートが終了するらしいので、カスタムランタイムに移行した話

早速ですが、不穏なメールが届きました。

Amazon Linux AMI のメンテナンスサポートが 2023 年 12 月 31 日に終了するのに合わせて、AWS Lambda での Go 1.x ランタイムのサポートを終了します [1]。
Lambda は、provided.al2 ランタイムを使用して Go プログラミング言語を引き続きサポートします。
provided.al2 ランタイムを使用すると、AWS Graviton2 プロセッサのサポートや、より小さなデプロイパッケージとより高速な関数呼び出しパスによる効率的な実装など、go1.x ランタイムに比べていくつかの利点があります。
詳細については、ブログ記事 [2] を参照してください。


GS2 が実行基盤に使用している AWS Lambda の go 1.x ランタイムがサポート終了になるようです。
provided.al2 というカスタムランタイムを使用すれば引き続き、Golang で利用を継続できるようなので、早速試してみます。

実行バイナリの名前は bootstrap である必要があるようなので、Makefile

go build -o bin/main main.go

から、以下に変更しました。

go build -o bin/bootstrap main.go

GS2 では AWS SAM を使用してデプロイしているため

  Function:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: function-name
      CodeUri: bin
      Handler: main
      Runtime: go1.x

  Function:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: function-name
      CodeUri: bin
      Handler: bootstrap
      Runtime: provided.al2
      Architectures:
        - x86_64

にしました。

まずは1つの関数に変更を加えて開発環境に反映してみます。

何事もなくに疎通でき、E2Eテストもパスできたので、パフォーマンスの変化を見ます。

開発環境なのでアクセス数が多くないため、ばらつきが多く正直よくわからないですが少なくとも悪くはなってなさそうです。
本番環境に 10% のトラフィックで反映しても問題なさそうだったので、そのまま全体に反映しました。

大量にトラフィックを流しても特にパフォーマンスに大きな変化は見られなさそうです。

Lambda の請求には、go1.x ランタイムと provided.al2 ランタイムとの間に違いがあります。
go1.x ランタイムでは、Lambda は関数の初期化 (コールドスタート) に費やされた時間を請求しませんが、
provided.al2 ランタイムでは、Lambda は請求される関数実行時間に関数の初期化時間を含めます。
Go 関数は通常非常に迅速に初期化され、Lambda は複数の関数呼び出しに関数実行環境を再利用することで初期化の回数を減らすため、
実際には Lambda 請求額の違いはごくわずかです。

という文章が気になるので、実際に請求に使用されるであろう Cloud Watch で確認できる Lambda の実行時間の変化を確認してみます。

これが実行回数の変化です。
オレンジ色が go 1.x ランタイム、青色がカスタムランタイムです。

こちらが実行時間の平均値です。
確かに最初のコールドスタートしたであろう部分は少し長くなっていますが、安定すれば変化があるんだかないんだかよくわからないレベルですね。

というわけで、このあと他の関数にも変更を反映していきます!

(C) Game Server Services, Inc.