【问题标题】:Scan S3 bucket, upload only zip files into S3 bucket扫描 S3 存储桶,仅将 zip 文件上传到 S3 存储桶
【发布时间】:2019-06-09 22:52:43
【问题描述】:

这是我将文件从本地服务器上传到 S3 存储桶的代码,当我指定要上传的文件时,该代码有效。

import boto3
import sys, ast
import io
import os
from zipfile import ZipFile
import json
from pprint import pprint
import urllib.request
import traceback
from datetime import datetime


accesskey = sys.argv[1]
secretkey = sys.argv[2]
sessiontoken = sys.argv[3]
kmskeyid = sys.argv[4]
filepath = sys.argv[5]
s3bucket = sys.argv[6]
s3key = sys.argv[7]

try:
    s3_client = boto3.client(
        's3',
        aws_access_key_id = accesskey,
        aws_secret_access_key = secretkey,
        aws_session_token = sessiontoken,
        region_name="us-east-1"
    )
except Exception as e:
    print("[ERROR]\nFAILURE CREATING S3 CLIENT!")
    traceback.print_exc()
    sys.exit(1)

def upload_file_to_s3():
    #s3_client.upload_file(version + '.zip', s3bucket, s3key,ExtraArgs={"ServerSideEncryption": "aws:kms", "SSEKMSKeyId": "arn:aws:kms:us-east-1:XXXX"})
    with open(filepath, 'rb') as code:
        s3_client.upload_fileobj(code, s3bucket, s3key,ExtraArgs={"ServerSideEncryption": "aws:kms", "SSEKMSKeyId": kmskeyid})


try:
    print('Uploading object to S3 bucket: ' + s3bucket + "/" + s3key)
    upload_file_to_s3()
    print("[INFO]\nFile successfully uploaded to S3.")
except Exception as e:
    print("[ERROR]\nFAILURE UPLOADING TO S3!")
    traceback.print_exc()
    sys.exit(1)

我从本地服务器运行的命令:

python3 ./scripts/python/upload_file_to_s3_min.py $AWS_ACCESS_KEY_ID $AWS_SECRET_ACCESS_KEY $AWS_SESSION_TOKEN $AWS_KMS_KEY_ID *.zip* $AWS_BUCKET deploy/scripts/

错误信息:

Uploading object to S3 bucket: file2.zip/file3.zip
[ERROR]
FAILURE UPLOADING TO S3!
Build step 'Execute shell' marked build as failure
Finished: FAILURE

由于某种原因,脚本没有通过 $bucketname

谢谢,

【问题讨论】:

  • 我会说您的外壳正在扩展 .zip 参数,该参数正在填充您的 sys.argv[5] 变量。

标签: python amazon-web-services amazon-s3 boto3


【解决方案1】:

一些一般性反馈...

人们通常将他们的 AWS 凭证存储在配置文件中。这可以通过使用AWS Command-Line Interface (CLI) 并运行aws configure 命令来完成。

以这种方式保存凭据后,您的代码不需要引用任何凭据。它们将被自动发现。

所以,你的代码可以这么简单:

s3_client = boto3.client('s3', region_name="us-east-1")

with open(filepath, 'rb') as code:
    s3_client.upload_fileobj(code, s3bucket, s3key,ExtraArgs={"ServerSideEncryption": "aws:kms", "SSEKMSKeyId": kmskeyid})

如果您的意图是简单地从命令行调用它,那么您可以简单地使用 AWS CLI 命令,而不是编写自己的脚本:

aws s3 cp foo.zip s3://my-bucket/foo.zip --sse-kms-key-id xxx 

【讨论】:

  • 谢谢约翰。我们使用 Jenkins 来传递变量。我们没有在 jenkins 节点上安装 AWS CLI,这就是我们使用 python 脚本的原因
猜你喜欢
  • 1970-01-01
  • 2017-04-19
  • 2018-04-25
  • 2020-01-18
  • 2017-11-23
  • 1970-01-01
  • 2018-03-25
  • 2018-02-07
  • 1970-01-01
相关资源
最近更新 更多