💨

AWSを触ってみる【Lambda】

に公開

はじめに

AWSが提供する学習プラットフォームAWS Skill Builderの学習プランが11/2まで無料で急ぎでやってみたので学んだことをまとめます。
https://aws.amazon.com/jp/blogs/news/begin-your-aws-journey-with-new-free-aws-builder-labs-learning-plan-on-aws-skill-builder/
実際にAWSコンソールを開きながら進められるのでおすすめです。
※自分はAWSを業務で若干しか触ったことないレベルなのでほぼ初心者です。

Lambdaとは

Lambda は、サーバーの管理なしでコードを実行できるサービスです。
クラウド上に関数を置き、サーバー不要で関数を実行できるイメージです。

類似サービス (サーバーレス / Function as a Service)

  • Google Cloud Functions(GCP)
  • Azure Functions(Microsoft)
  • Cloudflare Workers(Cloudflare)

Lambdaの特徴

サーバーレス

サーバーの準備や管理が不要で、コードの実行に集中できます。

イベント駆動

特定のイベント(例: S3へのファイルアップロード)をトリガーにして、関数が自動的に実行されます。

オートスケーリング

アクセスが急増しても、自動的にリソースをスケールアップし、安定した性能を維持します。

従量課金制

実行時間やリクエスト数に基づいて課金されます。

Lambdaの用途

Lambda は単体で使うより、他の AWS サービスと組み合わせて動かすことが多いです。
以下は一例で、「トリガーとなるイベントが発生した時に実行する」のでなんでもできます。

  • バックエンド処理
    例:API Gatewayと組み合わせてAPIとして動作
  • 画像処理・データ加工
    例:S3 にアップロードされた画像を自動リサイズさせる
  • バッチ処理
    例:CloudWatch Events で cron 実行(1日1回など)
  • Webhook / 外部サービスとの連携
    例:Stripe の支払い完了イベントを受け取り、メール送信やDB保存を実行
  • 通知処理
    例:特定のイベント発生時に Slack に通知する
  • 認証・ユーザー管理処理
    例:Cognito ユーザー登録時に Lambda を実行し、初期データを作成する

ランタイム

Lambda では どの言語で実行するか を「ランタイム」として選択します。以下代表的なもの

  • Node.js
  • Python
  • Go
  • Java / Kotlin
  • .NET (C#)
  • Ruby

Lambda へのコードアップロード方法

ZIP をアップロードする

関数コードと依存関係をまとめたZIPファイルをアップロードする方法です。
小規模 / 試すだけの場合に最適。コード + 依存ライブラリを ZIP にしてアップロードするだけ

コンテナイメージ(Docker)としてデプロイ

関数コードをコンテナイメージとして作成し、AWS ECR(Elastic Container Registry)などのコンテナレジストリからデプロイする方法です。

IaC(Infrastructure as Code)で管理する

インフラ構成をコードで管理し、自動デプロイできます。本番運用やチーム開発向け。

  • Terraform
  • AWS CDK
  • AWS SAM
  • Serverless Framework

画像をリサイズする Lambda関数を作成する

Amazon S3 から画像を読み取り、画像のサイズを変更して Amazon S3 に新しい画像を保存する AWS Lambda 関数を作成します。

動作の流れ(全体像)

  • ユーザーが images-580268205986 に画像をアップロードする
  • その S3イベント(ObjectCreated) が トリガー になって Lambda を起動
  • Lambda がアップロード元 S3 から画像を /tmp にダウンロード
  • Pillow でリサイズ
  • リサイズ済み画像を images-580268205986-resized に アップロード
  • 結果、*-resized 側に縮小画像が自動生成される

事前作業

あらかじめバケット「images-580268205986」、「images-580268205986-resized」を作成しておきます。
images-580268205986に画像をアップロードします。

Lambda関数を作成する

  1. マネジメントコンソールでLambdaを検索>関数を作成

  2. 一から作成>関数名入力

  3. ランタイム「Python 3.12」を選択

  4. 実行ロール「既存のロールを使用する」>「lambda-execution-role」を選択]

  1. 「関数を作成」>Dismiss

トリガーを追加する

  1. トリガーを追加

  2. トリガーの設定「S3」を選択

  3. バケット「images-580268205986」を選択>追加

  1. コード>アップロード元>今回は元々用意されていたため「Amazon S3の場所」を選択>リンクを貼り付け>保存

  1. コードタブ>ランタイムの設定「編集」>ハンドラ名を「CreateThumbnail.handler」に変更>保存

  1. 「設定」タブ>「編集」>説明-オプションに追加>保存

以上でLambda関数が設定されました。

関数をテストする

  1. 「テスト」タブ>テストイベント「新しいイベントを作成」を選択
  2. イベント名入力
  3. テンプレート-オプション「S3 Put」選択


5. イベントJSONを編集

イベントJSON
{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-1",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "<バケット名>",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::<バケット名>"
        },
        "object": {
          "key": "<キー名=画像の名前>",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}

以下に置き換えます。

  • バケット名
    例:images-580268205986
  • キー名
    例:HappyFace.jpg
  1. 「テスト」
    実行成功

  2. S3の「images-580268205986-resized」バケットの中に、オリジナルより小さいサイズの画像が存在していることを確認

モニタリングとログ記録

Lambda関数をモニタリングする方法です。

  1. Lambda>該当の関数を選択

  2. 「モニタリング」タブ
    呼び出された回数などが確認できる

  3. 「CloudWatchログを表示」>「ログストリーム」
    ログを確認できる。

まとめ

まだまだ理解が浅いので追記していこうと思います。

Discussion