BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】AWS Lambdaで「Hello World」やってみた。

こんにちは!BFT名古屋支店の松野です。 今回はAWS Lambdaを利用してプログラミング学習あるあるのHello Worldを実際にやってみたので、その過程や気付いたことをまとめていこうと思います!
それではよろしくお願いします!


はじめに

昨今のパブリッククラウドの流行に伴いサーバーレスアーキテクチャも注目を集めています。そこで今回はAWSにおけるサーバーレスサービスの代表であるAWS Lambdaで遊んでみました。
サーバーレスってなに?という方は佐野さんが過去記事で詳しくまとめて下さっているのでそちらをご覧ください。

サーバーレスアーキテクチャについては以下リンクからどうぞ。

bftnagoya.hateblo.jp

AWS Lambdaについては以下リンクからどうぞ。

bftnagoya.hateblo.jp

AWS Lambdaってなに?

佐野さんの過去記事でも説明されていますが、ここでも簡単にAWS Lambdaについてまとめておこうと思います。
AWS LambdaとはFaaS(Function as a Service)に分類されるフルマネージドサービスであり、AWSにおいてサーバーレスアーキテクチャを実現する代表的なものです。その特徴はサーバーをプロビジョニングしたり管理することなくコードを実行でき、料金は実行時間のみに発生するため、コスト削減が期待できます。

事前準備

事前準備として以下の2点を実施します。

  • IAMユーザーへの権限付与
  • IAMロール作成

まずはAWSマネジメントコンソールにルートユーザーでログインします。
AWS Lambdaの検証で使用するIAMユーザーに既存のポリシーから「AWSLambda_FullAccess」というポリシーをアタッチします。 AWSLambda_FullAccessのポリシー概要は下の画像になります。AWS Lambdaに関するサービスがこれ一つで使えるようになります。

f:id:bftnagoya:20210115152159p:plain
AWSLambda_FullAccess概要

これでIAMユーザーへの権限付与は完了しました。

次にIAMロールの作成です。
IAMロールには「AWSLambdaBasicExecutionRole」というポリシーをアタッチします。
まずは信頼されたエンティティの種類からAWSサービスを選択し、ユースケースでLambdaを選択して次のステップ押下。

f:id:bftnagoya:20210115155411p:plain

次にロールにアタッチするポリシーの選択画面に遷移するので、AWSLambdaBasicExecutionRoleを選択して次のステップ押下。

f:id:bftnagoya:20210115155620p:plain

タグの追加画面に遷移するので必要であればタグを設定してください。今回は検証用の一時的なもののため設定はしません。

f:id:bftnagoya:20210115155728p:plain

最後に確認画面が表示されるので、お好みのロール名を付けてロール作成を押下したら完了です。今回のロール名は「AWSLambda_test」としました。

f:id:bftnagoya:20210115155857p:plain

ここまででIAMユーザへの権限付与とIAMロールの作成は完了になります。次はいよいよAWSLambdaで実際に関数を作成していきます。

それではやってみよう。

それではAWSLambdaで実際に関数を作成していきます。ルートアカウントから事前準備でポリシーをアタッチしたIAMユーザーに変更し、AWS Lambdaのサービス画面を開きます。
以下の画像がAWS Lambdaの関数一覧画面になります。初めて使用するときは関数は1つも作成されていない状態ですが、私はすでにHelloLambdaという関数が作成してある状態です。

ここから新たに関数を作成するので画面右上の関数の作成ボタンを押下。

f:id:bftnagoya:20210115161437p:plain

関数の作成画面が表示されます。今回は画像のように関数名を「HelloWorld」としランタイムはPython3.6、実行ロールは事前準備で作成した「AWSLambda_test」としました。
必要事項を記入及び選択したら関数の作成ボタン押下。

f:id:bftnagoya:20210115162734p:plain

少し待つと画面が切り替わり、問題なく関数が作成されたことが画面に表示されます。

f:id:bftnagoya:20210115163141p:plain
関数が問題なく作成された時の画面

問題なくHelloWorldという名前の関数が作成されたみたいですね。
画面下部に関数コードが記述されており、関数作成のタイミングで一から作成を選択した場合は以下のコードがデフォルトで記述されています。

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

lambda_handlerという関数にeventとcontextという引数が渡されています。詳細な説明はここではしませんが、event引数は各種イベントから引き渡される任意の入力値であり、context引数は実行環境の情報が含まれているオブジェクトになります。
今回はprintコマンドを使ってHelloWorldを出力することが目的なので、コードを以下のように書き換えます。

import json

def lambda_handler(event, context):
    print("Hello World!!")
    return

とてもシンプルになりましたね。returnもする必要がありませんが、この後に使うので残しておきます。
それでは実行してみましょう。実行前にデプロイボタンを押下するのを忘れないようにしてください。
実行方法はテスト機能を使います。画面右上にあるテストボタンを押下。

f:id:bftnagoya:20210115170909p:plain

テストイベントの設定画面が表示されます。ここでjson形式でevent引数に渡す任意の値を設定できます。
今回はprintコマンドを実行するだけなので空のjsonデータをテストデータとして送信してみます。
イベント名をtestHelloWorldとし作成ボタン押下。

f:id:bftnagoya:20210115171750p:plain

これでtestHelloWorldというテストイベントが作成されました。
ブルダウンから作成したテストイベントを選択し、テストボタン押下。

f:id:bftnagoya:20210115172628p:plain

さて、テスト結果はどうでしょうか。。。

f:id:bftnagoya:20210115173142p:plain

実行結果は成功です!!
ですが戻り値がnullになっており、Hello World!!は結果下部のログ出力部分に表示されています。
なるほどなるほど。つまりは関数の戻り値が一番上に表示され、関数内の標準出力先がCloudWatchLogになっているということみたいですね。やや強引ですが最後にコードを少し修正して再テストしてみましょう。
コードを以下のように修正します。

import json

def lambda_handler(event, context):
    print("Hello World!!")
    return "Hello World!!"

コードを上記のように修正したのちにデプロイし、先ほどのテストイベントでテストした結果がこちら。

f:id:bftnagoya:20210115174025p:plain

実行結果は成功し、戻り値にはHello World!!が表示されました。ログ出力部分も同様です。
想定通りの結果になってくれました。

おわりに

今回はAWS Lambdaについて簡単にまとめたあとに実際にLambdaを使ってプログラミング学習御用達の「Hello World!!」を実行してみました。個人的にとても面白いなというのが率直な感想です。あとは環境構築などを意識する必要がないのもいいですね。今回の記事では関数を実行することをメインにしたため、IAM周りのことやなぜJavaではなくPythonを選択したのかといったことには触れられませんでした。今後機会があればまとめたいと思います。

参考文献