こんにちは、技術1課の加藤です。 Lambda のランタイムに Amazon Linux 2 をサポートするものが増えました。
毎日AWSでも軽ーく取り上げてます↓
Amazon Linux の EOL も気になりますし、改めて詳細に確認してみました。
LambdaのOSバージョン
Lambda を作成する際にランタイムを指定しますが、選択するランタイムによって対応している OSバージョンが異なります。
例えば Python で言うと、 3.8 は Amazon Linux 2 で動きますが、3.7以前は全て Amazon Linux で動きます。
試しに確認してみます。 以下のコードを Python 3.6 の Lambda と Python 3.8 の Lambda で実行してみました。
import subprocess def lambda_handler(event, print(subprocess.check_output(["cat", "/etc/system-release"]))
cat /etc/system-release
を実行するだけの単純なコードです。
Python 3.6
START RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST b'Amazon Linux AMI release 2018.03\n' END RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Amazon Linux AMI release 2018.03 こちらは Amazon Linux を指しています。
Python 3.8
START RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST b'Amazon Linux release 2 (Karoo)\n' END RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Amazon Linux AMI release 2 (Karoo) Amazon Linux 2 になってますね。ドキュメント通りです。
今回のアップデート
今回、任意のランタイムを使用できるようにするカスタムランタイムが Amazon Linux 2 に対応しました。
コンソールみるとこんな感じになってます。
デフォルトのブートストラップを使用する が Amazon Linux を利用した旧来のランタイム。 下の Amazon Linux 2 でユーザー独自のブートストラップを提供する が名前通り Amazon Linux 2 を利用したランタイムです。
カスタムランタイムとは
軽く確認しておきましょう。 Lambda はデフォルトで複数のランタイムをサポートしています。
- Node.js 12
- Node.js 10
- Python 3.8
- Python 3.7
- Python 3.6
- Python 2.7
- Ruby 2.7
- Ruby 2.5
- Java 11
- Java 8
- Go 1.x
- .NET Core 3.1
- .NET Core 2.1
しかしこれ以外の言語を使って Lambda を実装したい、という方もいるかもしれません。 そういった需要に合わせ、カスタムランタイムという仕組みを提供しています。
これは任意のランタイムを関数コードを一緒にLambdaに渡すことで、公式に対応していない言語をLambdaで動かせるようにするもの。 Rust や サーバーサイド Swift、あるいはつい最近出た Python 3.9 のベータなんかを Lambda で使うことが可能になります。
それなりに癖があるのでここで詳細な使い方は取り上げませんが、Lambda をより柔軟に使えるようにするもの、と思っていただければ良いです。
AWS Lambda のカスタムランタイム - AWS Lambda
カスタムランタイムのOS確認手順
カスタムランタイムの Lambda をコンソールで立ち上げてみます。
そして関数コードを確認すると hello.sh というシェルスクリプトのファイルが用意されていることがわかります。
今回はこのファイルに直接OSバージョンを確認するコマンドを書き込んでしまいましょう。 hello.sh を開き、以下のように内容を変更します。
function handler () { cat /etc/system-release }
非常にシンプルですね。 この状態で関数のテスト実行をすれば、Pythonでお見せしたような結果が確認できます。
デフォルトのブートストラップを使用する
関数のリターン値としてこちらが取得できました。
"Amazon Linux AMI release 2018.03"
確かに旧版のカスタムランタイムは Amazon Linux で動いているようです。
Amazon Linux 2 でユーザー独自のブートストラップを提供する
[基本設定] > [編集] から ランタイムを変更します。
どうでもいいですが、関数作成の画面と異なり、こちらでは「Amazon Linux 2 でのカスタムランタイム」という非常にわかりやすい名前になっています。こっちに揃えて欲しいですね。
では実行した結果を確認します。
"Amazon Linux release 2 (Karoo)"
はい、確かに Amazon Linux 2 で動いていますね。
Go も Amazon Linux 2 環境で動く?
余談ですが、カスタムランタイムの Amazon Linux 2 対応と同じ日に出た情報で「Go を Amazon Linux 2 ベースの Lambda で動かせる」というものがありました。
AWS Lambda now supports Go on Amazon Linux 2
しかしドキュメントを見ても、Go x Amazon Linux 2の選択肢は出てきません。
![f:id:kkato1030:20200814130735p:plain f:id:kkato1030:20200814130735p:plain](https://cdn-ak.f.st-hatena.com/images/fotolife/k/kkato1030/20200814/20200814130735.png)
(情報が古いのかと疑って英語版のドキュメントにしてみましたがそれでも出てこない)
さらにコンソールでランタイムの選択肢を見ても Go 1.x 以外に Go の選択肢はないんですよね。
なんでだろうと首を捻っていたんですが、アップデートの情報を見るとこんな一文が。
To get started, upload your code through the AWS Lambda console and select provide your own bootstrap on Amazon Linux 2 runtime.
provide your own bootstrap on Amazon Linux 2 runtime = Amazon Linux 2 でユーザー独自のブートストラップを提供する、なので、どうやらカスタムランタイム使えば Go も Amazon Linux 2 で動かせるよ!ということらしいです。
ちなみに既存の Go ランタイムでも OS 確認してみましたが、結果は以下の通り、Amazon Linux でした。(手順は端折ります)
Amazon Linux AMI release 2018.03
Go on Amazon Linux 2 をコンソールポチポチで作成できるようになるまでには、もう少しかかるみたいですね。
さいごに
Amazon Linux 2 で使えるランタイムが増えたということで確認してきましたが、実態はカスタムランタイムが Amazon Linux 2 に対応したよ、というものでした。
Amazon Linux は 2020/12/31 パッケージの更新を終了、メンテナンスサポートが2023/6/30 までとなっています。
Amazon Linux AMI のサポート期間終了に関する更新情報 | Amazon Web Services ブログ
ユーザーの要望でかなり期限は伸びたようですが、将来的に今後は Amazon Linux 2 に移行していく必要があるのは変わりません。 一方、OSの変更に伴い既存のコードが動かなくなってしまう可能性もあり、対応自体は早めに行っておくのが吉でしょう。
ということで改めて、自分の使っているランタイムが Amazon Linux 2 に対応しているのか、していない場合、対応したランタイム上で既存のコードが動くのか、確認していただくことをおすすめします。