Blog

LambdaでGoランタイムが使えなくなるので、Terraformでカスタムランタイムに移行してみた

はじめに

こんにちは。いかりがわです。
普段はニフティトップページの開発運用を行っています。

このプロダクトの裏側ではGoで記述されたLambda関数がいくつか動いています。
公式からLambda関数についてメールが届きました。どうやらLambda関数のGoランタイムサポートが2023/12/31にサポート終了するらしいです。

Goのランタイムは Amazon Linux AMIに基づいています。Amazon Linux AMIのサポートが 2023/12/31に終了するに伴い、Goのランタイムもサポート終了となるようです。

Goのランタイムで動作しているLambda関数は、ランタイムをprovided.al2 (Amazon Linux 2 AMIベースのカスタムランタイム)に移行する必要があります。

何故Amazon Linux 2 AMIでGoのランタイムをサポートしてくれなかったんだ。。。。

AWS公式からの見解としては以下です。

Go は、他のマネージドランタイムとは異なる方法で実装されています。Go はネイティブコードにコンパイルされるため、Lambda は Go をカスタムランタイムとして扱います。provided.al2 ランタイムを使用して Go 関数を Lambda にデプロイすることをお勧めします。

Go による Lambda 関数の構築 – AWS Lambda

つまり、「コンパイル後はネイティブコードになるんだからわざわざGoのランタイムとして用意する必要ないやろ」と言うことです。

なので今回は、サポート終了してしまうgo1.xのランタイムからprovided.al2のカスタムランタイムに変更していく手順をまとめていきます。

前提

Lambda関数をTerraformで構築するためのディレクトリ構成は以下のようになっています。

また、Lambda関数の中で動いているコードは以下のようになっています。

変更してみる

aws_lambda_functionのruntime

ランタイムをgo1.xからprovided.al2に変更します。
前述の通り、コンパイル後はネイティブコードになるため、ランタイムはAmazon Linux 2 AMIベースのカスタムランタイムを指定します。

ビルド後のファイル名

現状のビルド周りのコードは以下のようになっています。
おそらく、TerraformでGoのLambdaを構築する際の一般的な方法だと思います。

今回は、go buildの部分を変更します。また、変更後に圧縮するため、圧縮元ファイルも変更します。
カスタムランタイムでは、実行ファイル名はbootstrapである必要があります。なので、go buildは以下のようになります。

圧縮元ファイルもbootstrapに変更します。

確認

実際にコンソールから確認してみます!
ランタイムがAmazon Linux 2 AMIベースのカスタムランタイムになっていることが確認できます!

テストでお試し実行してみても問題なく動作することが確認できます!

意外と簡単にGoランタイムからAmazon Linux 2 AMIベースのカスタムランタイムに移行できることがわかりました。
急いで移行する必要はないですが、簡単に移行できるので早めに移行することをお勧めします!

注意:コールドスタートにかかる時間も請求に含まれる

冒頭のメールに以下のような内容が記述されています。

カスタムランタイムに変更すると、コールドスタートにかかる時間も請求に含まれるため多少請求額に変化があるかもしれません。

GitHub

サンプルコードはこちらに公開しています。
https://github.com/k0825/go-lambda-al2-sample

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!