amareloのブログ(仮)

IT系勉強会で感じた想いや知見をメインに書いていきます。

JAWS-UG CLI専門支部 #164R Lambda入門 復習

1か月近く経とうとしていますが、7/16(木) JAWS-UG CLI専門支部 #164R Lambda入門がありましたので、復習ブログを書きます。 当日はハンズオンを受けましたが復習が追い付いていませんでした。やっと復習できました。

イベントページ

jawsug-cli.connpass.com

AWS Lambda とは

自分がAWS公式ドキュメントなどで復習した内容を書きます。 波田野さんがハンズオンで話したことではないと思いますが、ご了承ください。

ホワイトペーパーより、サーバレスは、

サーバーレスなFunction-as-aService(FaaS)の一種であり、イベントドリブンコンピューティングシステムを構築する手法の1つ

と書かれています。Lambdaをはじめ、サーバレスのポイントは以下の4つです。

  • サーバーのプロビジョニングや維持管理が不要
  • 柔軟なスケーリングが可能
  • デフォルトで高可用性と耐障害性が組み込まれている
  • コードが実行された時に課金される

Lambdaについては以下の通りです。

  • 隔離されたコンテナ内で実行され、1コンテナで複数イベントを同時実行することはない。
  • 別サービス(SNSトピックにメッセージが投稿された時など)のイベントをトリガにコードを実行する。
  • Lambdaの実行環境はAmazon LinuxのAMIが使われている。
  • 利用する言語の関数もしくはメソッドをハンドラーとして指定して、実行の際に呼び出す。
    • JSON形式でパラメータとして渡されるイベントデータにアクセス可能となる。
  • IAMロールに沿ってLambdaファンクションからAWSリソースへのアクセスが許可される。

ハンズオン構成図

http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-lambda-getting_started/_images/handson-getting_started.png

上記の通り、Cloud9からLambdaを実行してLambda内の関数を呼び出します。 CloudWatchLogsに実行ログを書き出し、同時にSNSを使ってメール通知するという構成です。 詳しい手順はこちらをご参照ください。

SNSトピック作成、Lambda作成と実行のコマンドは、以下の通りです。

IAMロール作成とポリシアタッチ

事前準備として、Lambdaに付与するIAMロールの作成とポリシアタッチをします。

IAMロールの作成
aws iam create-role --role-name <作成ロール名> \
--assume-role-policy-document file://<信頼ポリシードキュメントのファイル名>

※信頼ポリシドキュメントファイルは事前に準備しましたが、ここでは割愛します。

作成したロールが存在することを確認します。

aws iam list-roles \
--query "Roles[?RoleName == <作成したロール名>].RoleName" \
--output text
IAMロールのポリシーアタッチ

以下のコマンドで、IAMポリシー"CloudWatchLogsFullAccess"と"AmazonSNSFullAccess"をアタッチします。

aws iam attach-role-policy \
--role-name <ロール名>
--policy-arn <アタッチするポリシのARN>

ポリシがロールにアタッチされたことを確認します。

aws iam list-attached-role-policies \
--role-name <ロール名> \
--query "AttachedPolicies[?PolicyName == <アタッチしたポリシ名>].PolicyName" \
--output text

SNSトピックとサブスクリプション作成コマンド

まずはSNSトピックとサブスクリプション作成コマンドからです。

SNSトピックの構築
aws sns create-topic --topic-name <トピック名>

作成したSNSトピックが存在するか確認します。

aws sns list-topics \
--query "Topics[?contains(TopicArn, \`<トピック名>`\)].TopicArn" \
--output text
SNSサブスクリプション作成

<使用プロトコル>はメール、HTTP(S)、SQSなどを使えますが、今回はメール(email)を使います。

<使用エンドポイント>は、メールの場合は送信先メールアドレスを指定します。

aws sns subscribe --topic-arn <トピック名> \
--protocol <使用プロトコル> --notification-endpoint <使用エンドポイント>

作成したサブスクリプションのエンドポイントを確認します。

aws sns list-subscriptions-by-topic \
--topic-arn <サブスクリプション作成先トピックのARN> \
--query "Subscriptions[?Endpoint == <サブスクリプションエンドポイント名>].Endpoint" \
--output text

作成したサブスクリプションのARNを確認します。

aws sns list-subscriptions-by-topic \
--topic-arn <サブスクリプション作成先トピックのARN> \
--query "Subscriptions[?Endpoint == <サブスクリプションエンドポイント名>].SubscriptionArn" \
--output text

Lambda関数の作成と実行

次は本題のLambda関数の作成についてです。

Lambda関数の作成
aws lambda create-function --function-name <Lambda関数名> \
--description <関数の説明> \
--runtime <使用するRuntime> \
--role <付与するロール> \
--handler <Lambda関数のハンドラ名> \
--zip-file fileb://<ソースコードのZIPファイル>
Lambda関数の存在確認

作成した関数が存在するか確認します。

aws lambda list-functions \
--query "Functions[?FunctionName == <Lambda関数名>].FunctionName" \
--output text
Lambda関数の実行
aws lambda invoke --function-name <Lambda関数名> \
--payload file://<Lambda関数用ペイロードファイルの格納場所> \
<アウトプットファイル名>
CloudWatch Logsログイベントを取得

Lambdaの実行結果を、CloudWatch Logsログイベントで確認します。

aws logs filter-log-events \
--log-group-name <ロググループ名> \
--max-items <出力ログ数>

後片付け関係のコマンド

一通りハンズオンが終了したら、Lambda関数の削除とSNSトピックの削除を実行します。

IAMロールのポリシデタッチ

アタッチしたポリシをデタッチします。

aws iam detach-role-policy \
--role-name <ロール名> \
--policy-arn <デタッチするポリシのARN>
Lambda関数の削除
aws lambda delete-function --function-name <Lambda関数名>
CloudWatch Logs ロググループの削除
aws logs delete-log-group --log-group-name <ロググループ名>
SNSトピックの削除
aws sns delete-topic --topic-arn <削除対象トピックのARN>
IAMロールの削除
aws iam delete-role --role-name <削除対象ロール名>

最後に

今回のハンズオンの構成を参考に、連携させるサービスを変えて実現できそうなことは色々ありそうだなと思いました。プログラミング知識はあまりありませんが、Lambdaで使える言語を一つ習得して何か作ってみたくなりました。

Lambdaを通してSNSとIAMロールへのポリシアタッチ/デタッチの復習、CloudWatch Logsの学習ができて実のあるハンズオンになったと思いました。二度実施したことで強く実感しました。 また、過去のハンズオンも一度やったら終わりではなく、何度も復習して身に付けていくことが重要ですね。

復習ブログの書き方で悩んでおり、復習の手が止まってしまいましたが、夏季休暇も近いこと、先日のCloudWatch入門も復習したいこともあり、「ちゃんとLambdaの復習やろう!」とスイッチが入りました。やっと書けました。次は、夏期休暇中にCloudWatch入門の復習ブログも書けるよう頑張ろうと思います!