こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。
今回はAWS S3,SQS,Lambda,SNS環境にCloud9をベースとしたDjango環境を追加して、Django経由でS3に何らかのデータがアップロードされた際にメールが通知される環境を構築していきたいと思います。
今回が想定では最後となります。
前回の記事は以下となります。
また、DjangoからS3にデータを送るために以前私が作った以下の記事も軽く見てます。
全体の流れは以下にまとめています。
最終的な構築イメージ
以下環境を作っていきます。今回はCloud9/Djangoを実装していきます。
DjangoのPJ
DjangoのProjectは以下GitHubをご覧ください
構築
Cloud9でサーバ立ち上げ、環境セットアップ
Cloud9に入って以下のコマンドを実行します
pip3 install django boto3
django-admin startproject qiita
cd qiita/
mkdir static
mkdir templates
作成したstaticとtemplatesディレクトリにそれぞれcssとhtmlを作成し以下の状態にします。
S3設定
Cloud9/Djangoの受皿となるS3のCORS設定に以下を追加します。
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"PUT",
"POST",
"DELETE"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": []
}
]
ACCESSキーとSECRET ACCESSキーを用意する
IAMを開きユーザを作成します。
ユーザの作成を押下します。
名前はなんでも大丈夫です。
ポリシーを直接アタッチを選択します。
許可ポリシーのところでEC2とS3を検索し、それぞれのFullAccessポリシーにチェックを入れます。
ユーザの作成が出来たら、右上にあるアクセスキーを作成を押下します。
以下を選択し、次に進みます。
アクセスキーとシークレットアクセスキーが確認できるようになりますので控えます。控えたら完了を押下します。
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をクリックします。
するとDjangoにWebブラウザでアクセスることが出来ます。
ファイルを選択します。
ファイルが表示されていることを確認し、アップロードします。
S3の画面に移動し、Djangoの画面で選択したファイルがアップロードされていることを確認します。
また、SNSで登録したメールアドレスにメッセージが届ていることを確認します。Lambdaを修正したことでファイル名とS3バケット名が表示されていますね。