1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS S3/SQS/Lambda/SNSにCloud9を連携し、メール通知を行ってみる[04]

Last updated at Posted at 2024-05-08

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はAWS S3,SQS,Lambda,SNS環境にCloud9をベースとしたDjango環境を追加して、Django経由でS3に何らかのデータがアップロードされた際にメールが通知される環境を構築していきたいと思います。
今回が想定では最後となります。

前回の記事は以下となります。

また、DjangoからS3にデータを送るために以前私が作った以下の記事も軽く見てます。

全体の流れは以下にまとめています。

最終的な構築イメージ

以下環境を作っていきます。今回はCloud9/Djangoを実装していきます。
aws-django01-ページ6.drawio.png

DjangoのPJ

DjangoのProjectは以下GitHubをご覧ください

構築

Cloud9でサーバ立ち上げ、環境セットアップ

以下のパラメータでCloud9環境をデプロイします。
1000003045.png

Cloud9に入って以下のコマンドを実行します

pip3 install django boto3
django-admin startproject qiita
cd qiita/
mkdir static 
mkdir templates

作成したstaticとtemplatesディレクトリにそれぞれcssとhtmlを作成し以下の状態にします。
1000003053.png

S3設定

Cloud9/Djangoの受皿となるS3のCORS設定に以下を追加します。

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

1000003064.png
1000003068.png

ACCESSキーとSECRET ACCESSキーを用意する

IAMを開きユーザを作成します。
ユーザの作成を押下します。
2024050801.png
名前はなんでも大丈夫です。
2024050802.png
ポリシーを直接アタッチを選択します。
許可ポリシーのところでEC2とS3を検索し、それぞれのFullAccessポリシーにチェックを入れます。
2024050803.png
2024050804.png
ユーザの作成が出来たら、右上にあるアクセスキーを作成を押下します。
2024050805.png
以下を選択し、次に進みます。
2024050806.png
アクセスキーとシークレットアクセスキーが確認できるようになりますので控えます。控えたら完了を押下します。
2024050807.png

Cloud9/Djangoの作り込み

settings.pyやurls.py,views.py,各種html/cssはGutHubを参考に設定してください。
settings.pyはimport os等をしていたり、クロスサイトリクエストフォージェリ関係の設定をコメントアウトして無効化してます。他にもこまごまと設定を修正しています。
またviews.pyでアップロード先のS3バケットを名前で指定してあげてください(Arnではありません。)

その後、ACCESS KEYとSECRET ACCESS KEYを.bashrcに記載し、永続的に登録します。

ec2-user:~/environment $ cd ../..
ec2-user:~ $ ls -a
.   .aws           .bash_logout   .bashrc  .cache      .gitconfig  .local   .npm  .profile  .ssh     .zshrc       go            package-lock.json
..  .bash_history  .bash_profile  .c9      .codeintel  .gnupg      .mkshrc  .nvm  .rvm      .zlogin  environment  node_modules  package.json

ec2-user:~ $ vi .zshrc

# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.
export PATH="$PATH:$HOME/.rvm/bin"
export AWS_ACCESS_KEY_ID="IAMのアクセスキー"
export AWS_SECRET_ACCESS_KEY="IAMのシークレットアクセスキー"

ec2-user:~ $ source ~/.zshrc

Lambdaの関数修正

以下のように修正し、アップロードされたファイル名、アップロード先のS3バケット名を通知メールに記載するようにします。

import boto3
import json

client = boto3.client('sns')

def lambda_handler(event, context):
    # SQS メッセージをパース
    for record in event['Records']:
        # SQS メッセージの body を JSON として読み込む
        message = json.loads(record['body'])
        # S3 イベント通知データを取得
        s3_info = message['Records'][0]['s3']
        # バケット名を取得
        bucket_name = s3_info['bucket']['name']
        # オブジェクトのキーを取得
        object_key = s3_info['object']['key']

        # SNS に送るメッセージを作成
        subject = 'File Uploaded to S3'
        message = f'A file has been uploaded to S3: {object_key} in bucket {bucket_name}'

        # SNS トピックにメッセージを公開
        params = {
            'TopicArn': 'arn:aws:sns:ap-northeast-1:310016072763:qiita-sns',
            'Subject': subject,
            'Message': message
        }
        client.publish(**params)

テスト

Cloud9のターミナルでpython3 manage.py runserver 0.0.0.0:8080と入力します。するとターミナルの右上に"Your code is running~"とURLが表示されていると思います。このURLをクリックします。
2024050808.png
するとDjangoにWebブラウザでアクセスることが出来ます。
ファイルを選択します。
2024050809.png
2024050810.png
ファイルが表示されていることを確認し、アップロードします。
2024050811.png
S3の画面に移動し、Djangoの画面で選択したファイルがアップロードされていることを確認します。
2024050812.png
また、SNSで登録したメールアドレスにメッセージが届ていることを確認します。Lambdaを修正したことでファイル名とS3バケット名が表示されていますね。
2024050813.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?