Python boto3 Amazon SES メール送信

Python boto3 SES メール送信

AWSAmazon SES を利用し、 Python + boto3 から メール送信する コード例です。

Amazon SES は、ユーザー自身の Eメールアドレスとドメインを使用して Eメールを送受信サービスを提供しています。

SES画面左側の「Verified identities」を選択し 「Create identity」で自分のメールアドレスを登録します。

[Create identity]で設定完了すると Amazon Web Services から自分宛てにメールが届きます。 本文のリンクをクリッククリックし verification します。

上記の設定完了後、 Python + boto3 から SES送信 をテストします。

SES送信 コード例

import boto3
ses = boto3.Session(region_name="ap-northeast-1",
    aws_access_key_id="アクセスキー",
    aws_secret_access_key="シークレット").client("ses")
res = ses.send_email(
    Destination={'ToAddresses': ["宛先自分のメールアドレス"] },
    Message={
        'Body': { 
            'Html': { 'Charset': "UTF-8",'Data': "<html><body>HTMLの場合の本文</body></html>"},
            'Text': { 'Charset': "UTF-8",'Data': "テキストの場合の本文"}
            },
        'Subject': { 'Charset': "UTF-8",'Data': "タイトル"}
        },
    Source="自分のメールアドレス"
    )
print(res)

自分の gmailだと 下のような 「このメールはなりすましの可能性があります。」とでてしまいます。 ドメインあれば DNSでこのメッセージは回避できます

「このメールはなりすましの可能性があります。」メッセージが表示される

Python S3 JSONデータを保存|読込

Python S3 JSONデータを保存|読込

Python boto3を 使って プログラム中の変数などのデータを AWS S3へ 保存・読込をする コード例です。

S3へ JSONデータを 保存

import json
import boto3

test_json = {'name': '毛利', 'age': 10} #←S3に保存したいDict変数
s3 = boto3.Session(region_name=None).resource('s3')
obj = s3.Object("bucket名","folder名/test.json")

obj.put(Body = json.dumps(test_json, ensure_ascii=False)) #←変数をJSON変換し S3にPUTする

Dict型の 変数は、 json.dumps()でJSON文字列に変換しS3にputしています

json.dumps()の ensure_asciiは デフォルトTrueなのでFalseにします。 文字列に 非ASCII文字が含まれていれば、 戻り値に 非ASCII文字を含めることができます。

S3の JSONファイル を読込し Dict変数に変換

import json
import boto3

s3 = boto3.Session(region_name=None).resource('s3')
obj = s3.Object("bucket名","folder名/test.json") 
json_txt = obj.get()['Body'].read() #データを読み込む
item_dict = json.loads(json_txt) #JSON文字列をdictに変換
print(item_dict["name"])

get()するとResponseMetadataのオブジェクトで返ります

json.loads()を使えば JSON文字列を Dictに変換できます

Node.js DynamoDB 全レコード Scan コード例

Node.js DynamoDB 全レコード Scan コード例

Node.jsを使って、 AWSDynamoDB テーブル内をスキャンする

予め、 npm init を完了させて 下↓のコマンドで aws-sdk を インストールしておきます。

npm install aws-sdk

下のコードは シンプルな Scan コード例です

const aws = require('aws-sdk');
const tableName = "テーブル名"
let dynamoDB = new aws.DynamoDB.DocumentClient({
    region: 'ap-northeast-1'
})
let DynamoDBScanAll = async () => {
    return await dynamoDB.scan({TableName: tableName}).promise()
}

Promise.all([DynamoDBScanAll()]).then((threadList) => {
    threadList.forEach(scanAllRes => {
        let res = JSON.stringify(scanAllRes.Items)
        console.log(res)
    })
})

上記コードの場合 「1 回の Scan リクエストで、最大 1 MB のデータを取得」 なので 全件数を 取得できません。

テーブル内の全レコード Scan する場合の コード例

下↓の コード例は、 LastEvaluatedKey == nullになるまで ループし スキャンを続けます。

const aws = require('aws-sdk');
const tableName = "テーブル名"
let dynamoDB = new aws.DynamoDB.DocumentClient({
    region: 'ap-southeast-2'
})
let DynamoDBScanAll = async () => {
    let ScanAll = []
    let LastEvaluatedKey = null;
    let loop = true
    try{
        while(loop){ //ループ開始
            let scanRes = {};
            let param = {TableName: tableName, ExclusiveStartKey: LastEvaluatedKey};
            scanRes = await dynamoDB.scan(param).promise() //スキャン実行
            ScanAll = ScanAll.concat(scanRes.Items) //配列結合
            LastEvaluatedKey =  (scanRes['LastEvaluatedKey'] != null) ? scanRes['LastEvaluatedKey'] : null
            if (LastEvaluatedKey == null) //LastEvaluatedKeyがnullならループ終了
                loop = false
            else
                console.log(JSON.stringify(LastEvaluatedKey))
        }
    
    } catch(e){
        console.log(e)
    }
    return ScanAll
}

Promise.all([DynamoDBScanAll()]).then((threadList) => {
    threadList.forEach(scanAllRes => {
        let res = JSON.stringify(scanAllRes)
        console.log(res)
    })
})

2回目以降のスキャンは、 scanパラメータに ExclusiveStartKeyを含め処理します。