S3バケット「テスト」でJSONを追跡し続けました
{
'Details' : "Something"
}
次のコードを使用してこのJSONを読み取り、キー「Details」を出力しています
s3 = boto3.resource('s3',
aws_access_key_id=<access_key>,
aws_secret_access_key=<secret_key>
)
content_object = s3.Object('test', 'sample_json.txt')
file_content = content_object.get()['Body'].read().decode('utf-8')
json_content = json.loads(repr(file_content))
print(json_content['Details'])
そして、私は「文字列インデックスは整数である必要があります」としてエラーが発生しています.
上記のコメントで述べたように、repr
は削除する必要があり、json
ファイルは属性に二重引用符を使用する必要があります。 aws/s3でこのファイルを使用:
{
"Details" : "Something"
}
そして、次のPythonコードで動作します:
import boto3
import json
s3 = boto3.resource('s3')
content_object = s3.Object('test', 'sample_json.txt')
file_content = content_object.get()['Body'].read().decode('utf-8')
json_content = json.loads(file_content)
print(json_content['Details'])
# >> Something
次は私のために働いた。
# read_s3.py
import boto3
BUCKET = 'MY_S3_BUCKET_NAME'
FILE_TO_READ = 'FOLDER_PATH/my_file.json'
client = boto3.client('s3',
aws_access_key_id='MY_AWS_KEY_ID',
aws_secret_access_key='MY_AWS_SECRET_ACCESS_KEY'
)
result = client.get_object(Bucket=BUCKET, Key=FILE_TO_READ)
text = result["Body"].read().decode()
print(text['Details']) # Use your desired JSON Key for your value
ベストプラクティスとして、AWS Idと秘密キーを直接ハードコーディングすることはお勧めできません。次のいずれかを検討できます。
(1)ローカルストレージに保存されているjsonファイルからAWS認証情報を読み取ります。
import json
credentials = json.load(open('aws_cred.json'))
client = boto3.client('s3',
aws_access_key_id=credentials['MY_AWS_KEY_ID'],
aws_secret_access_key=credentials['MY_AWS_SECRET_ACCESS_KEY']
)
(2)環境変数から読み取ります。
import os
client = boto3.client('s3',
aws_access_key_id=os.environ['MY_AWS_KEY_ID'],
aws_secret_access_key=os.environ['MY_AWS_SECRET_ACCESS_KEY']
)
環境変数を次のように設定するシェルスクリプトがあるとします。
# set_env.sh
export MY_AWS_KEY_ID='YOUR_AWS_ACCESS_KEY_ID'
export MY_AWS_SECRET_ACCESS_KEY='YOUR_AWS_SECRET_ACCESS_KEY'
# execute the python file containing your code as stated above that reads from s3
python read_s3.py
環境を設定し、read_s3.py
を一緒に実行するには、次のようにターミナルでシェルスクリプトを実行できます。
sh set_env.sh
デコードが機能しなかったため、少し行き詰まりました(s3オブジェクトはgzip圧縮されています)。
私を助けたこの議論を見つけました: Python gzip:文字列から解凍する方法はありますか?
import boto3
import zlib
key = event["Records"][0]["s3"]["object"]["key"]
bucket_name = event["Records"][0]["s3"]["bucket"]["name"]
s3_object = S3_RESOURCE.Object(bucket_name, key).get()['Body'].read()
jsonData = zlib.decompress(s3_object, 16+zlib.MAX_WBITS)
JsonDataを印刷すると、目的のJSONファイルが表示されます! AWS自体でテストを実行している場合は、CloudWatchのログを確認してください。ラムダは長すぎる場合、完全なJSONファイルを出力しません。