AWS LambdaとS3、SNSでファイルのアップロードを自動通知
AWS LambdaとS3、SNSでファイルのアップロードを自動通知 AWS Lambdaは特定の条件を満たすときにサーバーレスでPython(他のプログラミング言語も)を実行できるサービスです。トリガーを検知したときや […]
Filter by Category
AWS LambdaとS3、SNSでファイルのアップロードを自動通知 AWS Lambdaは特定の条件を満たすときにサーバーレスでPython(他のプログラミング言語も)を実行できるサービスです。トリガーを検知したときや […]
S3のライフサイクルルールの落とし穴 保存したデータが必要以上に増えないようにライフサイクルルールで指定した日数を経過したデータは削除する設定にしていましたが、後日改めてバケットを確認するとフォルダ、ファイルどちらも削除 […]
S3でストレージクラスを一括で変更 デフォルトではS3のストレージクラスは「標準」になっていますが、このストレージクラスは頻繁にアクセスするデータを保存するのに適した設定なので、バックアップファイルなどの頻繁にアクセスし […]
データベースのバックアップファイルをAWSのS3に保存するプログラムを手動で叩くと問題なくS3にファイルが保存されるのに、cronで定期的に実行したらエラーが出るようになったので調べた内容です。原因はPythonのパスが […]
AWS Lambdaは特定の条件を満たすときにサーバーレスでPython(他のプログラミング言語も)を実行できるサービスです。トリガーを検知したときや指定したタイミングでのみ起動するので、常時起動しているEC2などと比べてコスト面でも優れています。さらに、バッチ処理や特定のスクリプトはcronで実行することも多かったですが、AWS Lambdaに移行することで本番環境のリソースを使わずに処理を実行できることも魅力的です。
本記事ではAWS LambdaとストレージサービスのS3、メッセージ通知サービスのSNSを組み合わせて、S3でファイルのアップロードを検知したらAWS Lambdaでファイル名を取得して、取得したファイル名をSNSでメールに通知する機能を構築します。
ストレージサービスのS3で新しいをバケットを作成します。「バケットを作成」を押します。
バケット名とリージョンを指定します。
バケット名: lambda-triggered-file-upload-bucket-dev
リージョン: 東京
IAMでSNS用のポリシーを作成します。「ポリシーの作成」を押します。
SNSを選択して、書き込み権限の「Publish」を選択します。リソースは「すべて」を選択して「次へ」を押します。
ポリシー名を入力して「ポリシーの作成」を押します。
ポリシー名: SNSPublishS3ToLambdaDev
メッセージ通知サービスのSNSでトピックを作成します。トピック名を入力して「次のステップ」を押します。
スタンダードを選択して「トピックの作成」を押します。
サブスクリプションを作成します。「サブスクリプションの作成」を押します。ARNの値は後ほどLambda関数の設定で必要になるのでコピーしておきます。
トピックARNは先程作成したトピック名を選択、プロトコルはEメールを選択、エンドポイントには通知するメールアドレスを入力して「サブスクリプションの作成」を押します。
トピックARN: LambdaTriggeredEmailsDev
プロトコル: Eメール
エンドポイント: 通知するメールアドレス
サブスクリプションが作成されるとエンドポイントに入力したメールアドレス宛に確認メールが届くのでURLをクリックします。
この画面が表示されればサブスクリプションの作成が完了です。
URLをクリック後、SNSのサブスクリプションを確認するとステータスが「確認済み」に変わります。
Lambdaで関数を作成します。「関数の作成」を押します。
関数名を入力します。ランタイムはPythonを選択、アーキテクチャはx86_64を選択、実行ロールは新しいをロールを作成を選択して「関数の作成」を押します。
Lambda関数名: sendEmailOnS3UploadDev
ランタイム: Python
アーキテクチャ: x86_64
実行ロール: 新しいをロールを作成
Lambda関数が作成できたら実行ロールの設定を行います。ロール名のURLを押します。
「許可を追加」を押してから「ポリシーをアタッチ」を押します。
IAMで作成したポリシーを検索すると候補に表示されるので選択して「許可を追加」を押します。
Lambda関数を実行させるトリガーを設定します。「トリガーを追加」を押します。
S3を選択、バケット作成したバケット名を選択、イベントタイプは「PUT」と「POST」を選択して「追加」を押します。(コピーや削除をトリガーに追加することも可能)通知対象を特定のフォルダにする場合はPrefixにフォルダ名などを入力し、特定の拡張子を対象にする場合はSuffixに入力します。
トリガーにS3が追加されました。
Lambda関数に以下のコードを記述します。記述が終わったら「Deploy」を押して保存します。
import boto3
def lambda_handler(event, context):
sns = boto3.resource('sns')
arn = 'SNSトピックARN' # SNSトピックARN
file_name = event['Records'][0]['s3']['object']['key'] # S3にアップロードされたファイル名を取得
platform_endpoint = sns.PlatformEndpoint(arn)
subject = 'Lambdaから送られたメール'
msg = f'S3のバケットにファイルがアップロードされました。\nファイル名: {file_name}'
response = platform_endpoint.publish(
Message = msg,
Subject = subject
)
return response
SNSトピックARNの値はSNSでトピックを作成したときに生成された「arn:aws:sns:」から始まるARNの値を指定します。
arn = 'SNSトピックARN'
S3にファイルをアップロードしてメールが通知されるか確認します。「ファイルを追加」を押します。
選択したファイルをアップロードします。
アップロード完了後、メールを確認するとこのようにアップロードしたファイル名が通知されました。
CloudWatchでログを確認します。「CloudWatch ログを表示」を押します。
ログストリームに実行されたログが表示されます。詳しく見る場合はログのURLをクリックします。
群馬県でPythonを使ったAIやソフトウェアを開発している株式会社ファントムが運営しています。
メーリングリストに登録するとファントムの最新情報をお届けします
お客様のメールアドレスを共有することはありません