S3にアップロードされたファイル名をLambdaを使ってCloudwatch logsに出力してみた

記事タイトルとURLをコピーする

休日にAmazon Primeのドラマ視聴にハマって抜け出せなくなってしまったCI部5課の山﨑です。

DVAの試験勉強の時にあまり触れていなかったLambdaの勉強を始めました。基本的な内容だと思いますが、一つ一つ整理しながらまとめていきたいと思います。

Lambdaについて

AWS Lambda はサーバーをプロビジョニングしたり管理する必要なくコードを実行できるコンピューティングサービスです。利用者はコードの実行環境について考える必要がないため、コード作成に時間を集中させることが可能です。以下、よく比較対象とされるEC2とLambdaの比較表です。

 項目 EC2 Lambda
サーバー管理 必要 不要
実行環境の整備 必要 不要
負荷分散 ELBとAuto Scallingを別途使用するため工数がかかる 自動スケーリング
料金 コンピューティングキャパシティーに対して時間あたりまたは秒あたりで課金 ※使用していない時間も料金が発生してしまう  関数に対するリクエストの数とコードの実行時間に基づいて課金 
処理能力 インスタンスタイプの変更により柔軟に対応可 割当メモリ量に比例 ※メモリ量には制限あり

いざ、実践

構築フェーズは大きく分けて下記の3つです。

  • IAMロールの作成
  • S3の作成
  • Lambda関数の作成

IAMロールの作成

Lambdaに割り当てるIAMロールを作成します。今回Lambdaには「Cloudwatch」と「S3」へのアクセス許可を付与する必要があります。

IAMロールの作成画面でLambdaを選択

作成するプログラムによって付与するポリシーは異なるとは思いますが、今回は「AmazonS3FullAccess」「AWSLambdaBasicExecutionRole」を付与し、ロール名は「role-lambda」とします

S3の作成

ファイルをアップロードするS3を作成します

バケット名は「lambda-relation-with-s3」とし、その他の設定は特に変更せずにバケットを作成します。

Lambda関数の作成

ここでようやくLambda関数の作成に取り掛かります。

今回は設計図の使用(Blue print)を選択し、s3-get-object-pythonを選択します

下記のように設定して関数を作成します。

  • Function name:関数名を任意で入力
  • Execution Role:先程作成したIAMロール(role-lambda)を設定
  • バケット:先程作成したS3バケットを指定
  • イベントタイプ:今回は「すべてのオブジェクト作成イベント」を設定

ここから関数の編集画面でLambda関数のコードを書いていきます。

以下、今回のLambda関数のコード(Python)です。

def lambda_handler(event, context):
    key = event['Records'][0]['s3']['object']['key']
    print(key) #print関数の標準出力がCloudwatch Logsに出力される
    return(key)

lambda_handlerには「event」と「context」という2つの引数を必ず渡します

event引数について

event引数はイベントから引き渡されるJSON形式のデータです。今回はS3のCreateイベントが発生した際のデータがevent引数として関数に渡されます。実際に渡されるデータは下記のような形式になっています。

{
  "Records":[
    {
      "eventVersion":"2.0",
      "eventSource":"aws:s3",
      "awsRegion":"us-west-2",
      "eventTime":"1970-01-01T00:00:00.000Z",
      "eventName":"ObjectCreated:Put",
      "userIdentity":{
        "principalId":"AIDAJDPLRKLG7UEXAMPLE"
      },
      "requestParameters":{
        "sourceIPAddress":"127.0.0.1"
      },
      "responseElements":{
        "x-amz-request-id":"C3D13FE58DE4C810",
        "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD"
      },
      "s3":{
        "s3SchemaVersion":"1.0",
        "configurationId":"testConfigRule",
        "bucket":{
          "name":"sourcebucket",
          "ownerIdentity":{
            "principalId":"A3NL1KOZZKExample"
          },
          "arn":"arn:aws:s3:::sourcebucket"
        },
        "object":{
          "key":"HappyFace.jpg",
          "size":1024,
          "eTag":"d41d8cd98f00b204e9800998ecf8427e",
          "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko"
        }
      }
    }
  ]
}

参照ドキュメント:チュートリアル: Amazon S3 で AWS Lambda を使用する

関数によって受け取られたJSONデータはparseされてPythonのオブジェクトに変換されています。そのため、例えばJSONデータ中のkeyの値を取得したい場合は下記のように記述します。

event['Records'][0]['s3']['object']['key']

context引数について

context引数にはLambda関数名や割当メモリや実行可能な残時間など、Lambdaの実行環境の情報が含まれます。

実装したコードをテスト

Lambdaでは実装したコードを簡単にテストすることができます。Lambda関数の編集画面の上部のテストイベントの設定を選択し、必要なテスト情報を入力します。

設定後にテストのボタンをクリックするとテストが実行されます。

テストが問題なく実行されたので、実際にS3にファイルをアップロードしてみます。が、その前にやっておく作業があります。

S3のプロパティからイベントをクリックして通知設定を行います。

この通知設定をしておかないと、S3でイベントが発生したとしてもそのイベント情報をLambda関数にevent引数として引き渡すことができないため処理が正しく行われません。

そして、Lambda関数の編集画面からS3のイベントトリガーを有効にします。

ここまで設定ができたら変更内容を保存して、いよいよS3にファイルをアップロードします。

アップロードができたらCloudwatch Logsにファイル名が出力されているか確認してみます

無事に出力されていることが確認できました! まだまだ基本的な部分にしか触れることができていませんが、これからLambdaの学習をより進めていきたいと思います!!