AWS Lambda で Hello World
AWS Lambda はサーバレスなコンピューティングシステムです。
AWS Lambda(イベント発生時にコードを実行)| AWS
いわゆる FaaS(Function as a Service) です。
HTTPリクエストやS3、やkinesis, sqs, 定期実行 などのイベントをトリガーにコードを実行できます。
今回は 定期実行 の機能を使ってHello Worldを試してみます。
目次
Lambda 関数を作成する
Lambda Management Console
関数の作成を押して関数を作っていきます。
1から作成を選択して入力して下図のように入力していきます。
関数作成とトリガーを設定
Designer
関数コード修正
lambdaで動かすプログラムを書いていきます。
Designer 画面で lambda のアイコンを選択すると関数の設定が出てきます。 Node.js を選択している場合はそのまま画面上でコードを書くことができるので修正していきます。
デフォルトでテンプレートがあるので今回は body のメッセージだけを変えました。
exports.handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from mintsu!'),
};
return response;
};
CloudWatch Eventの追加
今回はcron形式(定期実行)で動かすため、CloudWatch Eventをトリガーとして追加します。
トリガーの設定
cron式は、普通のcronの書き方と若干違うので注意
スケジュール式
今回はcron式で記載します。 普通のサーバに設定するようなcron式とは若干違うので注意。詳しくはこちらを見ると良いです。
ルールのスケジュール式 - Amazon CloudWatch Events
今回は3分ごとに実行するように設定してみます。
cron(0/3 * * * ? *)
テスト(確認)
保存してからじゃないと反映されないようなので注意。
環境変数を使ってみる
上記だけでも実行環境は整っているのですが、 外部APIを叩くときのトークン管理など、環境変数を使いたい場面があるので、lambdaで環境変数を使う方法についても記載します。
コード修正
今回はbodyに環境変数から取ってきた値を埋め込むようにします。
Node.js で書いているのでprocess.env.<環境変数名>
で環境変数の値は取れます。
わかりやすいように、ログにresponseの内容が出るようにしておきます。
exports.handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello ' + process.env.AUTHOR),
};
console.log(response)
return response;
};
環境変数設定
下記の図のように設定します。
テスト実行
正常に動くかテスト実行して試してみましょう。
ちゃんと環境変数が展開されていることがわかります。
トリガーから実行する
今回はトリガーはすでに設定したので、有効化を行えばトリガーをもとに動くようになります。
トリガーの有効化
Designer から トリガーとなる CloudWatch Events クリックして設定を変更します。
設定に有効・無効の設定ができるので有効に設定します。
これで設定したトリガーによって動くようになります。
3分間に一度実行されるはずです。
CloudEvents のログ確認する
実行の確認に CloudEventsのログを確認します。
AWSのコンソールから 「CloudWatch」=>「ログ」=>「 /aws/lambda/<lambada名>」
直近のログストリームをクリックして確認すると3分ごとログが出ているのがわかります
感想
今回 Lambda について初めて触ってみましたが、画面上でコードを登録するだけで簡単にプログラムを実行できる点が非常に楽でした。 サーバレスというだけあって、実行環境を自分で用意したり特に自分で意識することもなく、開発に集中できそうです。
今回はCloudEventsを利用した定期実行を行いましたが、
定期実行を行うには今まではcronで設定等必要だったり意外と手軽にできるものがありませんでした。そんななか Lambda を使うと簡単に実行できるので積極的に使っていきたいです。
ただ毎回画面上から登録等やっていくのは大変ですので、githubとの連携方法やdeployについて今後調べて使っていきたいと思います。