目次
はじめに
S3バケットにファイルをアップロードした際に、自動的にLambdaを実行する仕組みを作ろうと考え、S3バケットをEC2にマウントして毎晩ローカルサーバからEC2経由でファイルを転送するプロセスを構築しました。
しかし、scpコマンドでファイルをコピーした際にはS3イベント通知が実行されず、Lambdaが動作しないという問題に直面しました。
この記事では、この問題を解決するために行った方法について説明します。
登場するサービス、OS
- ローカルサーバ: Windows Server
- EC2インスタンス: Amazon Linux
- S3: オブジェクトストレージサービス
- Lambda: サーバーレスコンピューティングサービス
用語解説
- scpコマンド: ファイルを安全にコピーするためのコマンド。特にリモートサーバー間で使用されます。
- S3イベント通知: S3バケット内で指定されたイベント(ファイルのアップロードなど)が発生した際に、通知やトリガーを発行する機能。
- Lambda: AWSが提供するサーバーレスコンピューティングサービス。イベント駆動型でコードを実行します。
作業の目的
毎晩、ローカルサーバからEC2経由でS3にファイルを自動的に転送し、その際にS3イベント通知を使ってLambdaを実行することで、ファイルのバックアップ状況を確認するシステムを構築することを目指しました。
誤った作業
最初に試みたのは、scpコマンドを使ってファイルをS3バケットにコピーする方法です。
しかし、この方法では、S3イベント通知が実行されず、Lambdaが起動しないという問題が発生しました。
エラー発生
S3バケットがEC2にマウントされている環境で、scpコマンドによるファイル転送ではS3イベント通知が実行されないことが判明しました。
これにより、S3にファイルを配置しても、Lambdaが自動的に実行されないというエラーが発生しました。
解決方法
この問題を解決するために、以下の手順を取りました。
- scpコマンドでファイル転送を実行: まずは、必要なファイルをscpコマンドでS3バケットにコピーします。
-
AWS CLIコマンドでトリガーファイルを作成: ファイル転送が完了したら、AWS CLIを使って特定のテキストファイル(例:
done.txt
)をS3バケットに作成します。 -
AWS CLIコマンドでトリガーファイルを削除:
done.txt
が作成された後、一定時間内にこのファイルを削除します。
これらのステップをbatファイルに組み込み、タスクスケジューラーを使用して毎晩定期的に実行するように設定しました。
これにより、ファイル転送後にS3イベント通知が実行され、Lambdaが正しく実行されることを確認しました。
重要なポイント
-
scpコマンドではS3イベント通知が実行されないことが最大のポイントです。
これにより、Lambdaの自動実行が行われないため、AWS CLIを補完的に使用しました。 - AWS CLIで作成したファイルが大量のイベントを実行しないようにするため、必要最小限のファイル操作のみを行い、不要なLambdaの実行を防止しました。