我一直在使用的方法是将Collection转换为List并查询长度:
s3 = boto3.resource('s3')
bucket = s3.Bucket('my_bucket')
size = len(list(bucket.objects.all()))
Run Code Online (Sandbox Code Playgroud)
然而,这迫使整个系列的解决方案并且首先避免了使用Collection的好处.有一个更好的方法吗?
我不确定如何使用AWS EC2显示我的实例的名称 boto3
这是我的一些代码:
import boto3
ec2 = boto3.resource('ec2', region_name='us-west-2')
vpc = ec2.Vpc("vpc-21c15555")
for i in vpc.instances.all():
print(i)
Run Code Online (Sandbox Code Playgroud)
我得到的回报是
...
...
...
ec2.Instance(id='i-d77ed20c')
Run Code Online (Sandbox Code Playgroud)
我可以改变i为i.id或者i.instance_type当我尝试时,name我得到:
AttributeError: 'ec2.Instance' object has no attribute 'name'
获取实例名称的正确方法是什么?
我正在尝试使用python在Amazon s3存储桶中列出对象boto3.
它似乎boto3有2个函数用于列出存储桶中的对象:list_objects()和list_objects_v2().
2和使用one之间的好处有什么区别?
在PyCharm中看到完整的intellisense(代码完成)选项时遇到问题.在Windows上使用python 3.4.建议部分工作:
import boto3
s = boto3.Session() (boto3. will bring up list of methods/params of object boto3)
ec2 = s.resource('ec2') (resource is a suggested method!)
ec2. <<<< this brings up nothing. For some reason PyCharm cant detect that ec2 object would have
Run Code Online (Sandbox Code Playgroud)
虽然我可以单独处理文档,但intellisense是一个很好的功能!
我有类似的问题让它完成lxml语法,但我认为那是因为我必须直接安装lxml作为二进制(太多的箍跳过窗口通过点子安装它)
其他人遇到类似的问题?
当我们在这里时,我看到很多不同的库使用awscli与python:boto,boto3,troposphere等.使用一个优于另一个有什么优点.亚马逊声称boto3是优于boto的方法,但是对于我使用较旧的boto可以很容易地使用启动/停止ec2实例.
我有一个脚本可以从 Cloudwatch 中提取大量指标用于我们自己的内部报告。
该脚本迭代特定区域中的所有 EC2 实例,并要求提供过去 2 周的 5 个 cloudwatch 指标(所有可用统计数据)(每 5 天间隔 5 分钟,正好是 1440 配额)。我正在使用一个假设的会话:
session = Session(aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, region_name=regionName)
sts = session.client('sts')
response = sts.assume_role(
RoleArn=arn, # External role arn
RoleSessionName='role-name',
ExternalId='<some-id-here>',
)
tempAccessKeyId = response['Credentials']['AccessKeyId']
tempSecretAccessKey = response['Credentials']['SecretAccessKey']
tempSessionToken = response['Credentials']['SessionToken']
assumedSession = Session(
aws_access_key_id=tempAccessKeyId,
aws_secret_access_key=tempSecretAccessKey,
aws_session_token=tempSessionToken,
region_name=regionName)
Run Code Online (Sandbox Code Playgroud)
在运行脚本时,我遇到了这个异常:
botocore.exceptions.ClientError: An error occurred (ExpiredToken) when calling the GetMetricStatistics operation: The security token included in the request is expired
Run Code Online (Sandbox Code Playgroud)
有没有办法确保令牌在运行脚本时不会过期?我正在使用 boto3。
我正在寻找在 AWS S3 存储桶上将数据从一个文件夹移动/复制到另一个文件夹的所有方法。
方法 1:通过 AWS CLI(最简单)
在你的实例上下载并安装 awscli,我在这里使用 windows(64 位链接)并运行“asw configure”来填写你的配置,然后在 cmd 上运行这个单一的命令
aws s3 cp s3://from-source/ s3://to-destination/ --recursive
Run Code Online (Sandbox Code Playgroud)
这里cp用于复制和递归复制所有文件
方法 2:通过 AWS CLI 使用 python
import os
import awscli
if os.environ.get('LC_CTYPE', '') == 'UTF-8':
os.environ['LC_CTYPE'] = 'en_US.UTF-8'
from awscli.clidriver import create_clidriver
driver = create_clidriver()
driver.main('s3 mv s3://staging/AwsTesting/research/ s3://staging/AwsTesting/research_archive/ --recursive'.split())
Run Code Online (Sandbox Code Playgroud)
即使这对我来说也很完美
方法 3:通过 Boto 使用 python
import boto3
s3 = boto3.resource('s3')
copy_source = {
'Bucket': 's3://staging/',
'Key': 'AwsTesting/research/'
}
s3.meta.client.copy(copy_source, ''s3://staging/'', 'AwsTesting/research_archive/')
Run Code Online (Sandbox Code Playgroud)
根据我的理解,我假设存储桶的“键”只是文件夹前缀,所以我在这里提到了文件夹路径
错误:
存储桶名称“s3://staging”无效:存储桶名称必须与正则表达式“^[a-zA-Z0-9.-_]{1,255}$”匹配 …
我正在从AWS S3 Bucket下载文件,如下所示:
import boto3
s3client = boto3.client("s3")
s3 = boto3.resource('s3')
bucket_name = 'practice_bucket'
bucket = s3.Bucket(bucket_name)
for obj in bucket.objects.all():
filename = obj.key.rsplit('/')[-1]
s3client.download_file(bucket_name, obj.key, "/txt/" + filename)
Run Code Online (Sandbox Code Playgroud)
当试图将一些文件放在子目录下时,例如/txt/我收到错误:botocore.exceptions.ClientError: An error occurred (404) when calling the HeadObject operation: Not Found.
奇怪的是,它适用于使用相同方法的其他文件类型,但不适用于具有.json扩展名的文件类型.
可能是什么问题?我甚至试过没有把它们放在一个绝对的子目录路径中,我没有得到任何错误,并将文件下载到与脚本下载相同的目录中.但是当我实际定义下载文件的路径时,我得到了错误.
提前谢谢你,一定要投票/接受答复
我正在尝试下载s3存储桶中的目录.我试图使用传输从S3存储桶下载目录,但我收到一个错误,因为"调用HeadObject操作时发生错误(404):未找到".请帮忙.
S3 structure:
**Bucket
Folder1
File1**
Run Code Online (Sandbox Code Playgroud)
注意:尝试下载Folder1
transfer.download_file(self.bucket_name, self.dir_name, self.file_dir + self.dir_name)
Run Code Online (Sandbox Code Playgroud) 我知道S3存储桶实际上没有目录,因为存储空间不足.但是可以使用python/boto3创建目录programmaticaly,但我不知道如何.我在纪录片上看到了这个:
"虽然S3存储是扁平的:存储桶包含密钥,S3允许您通过在密钥中使用分隔符在存储桶上强制使用目录树结构.例如,如果您将密钥命名为'a/b/f',并使用'/ '作为分隔符,S3将认为'a'是目录,'b'是'a'的子目录,'f'是'b'中的文件."
我可以通过以下方式在S3 Bucket中创建文件:
self.client.put_object(Bucket=bucketname,Key=filename)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何创建目录.
我需要使用boto3更新我的dynamodb表中的timestamp属性,但属性名称"timestamp"是一个保留字,因此它在SET命令上抛出错误.
table.update_item(
Key={
'id': item_id
},
UpdateExpression='SET timestamp = :val1', # this is the line giving the problem
ExpressionAttributeValues={
":val1": new_timestamp
}
)
Run Code Online (Sandbox Code Playgroud)
"errorMessage":"调用UpdateItem操作时发生错误(ValidationException):无效的UpdateExpression:属性名称是保留关键字;保留关键字:timestamp",
boto3 ×10
python ×8
amazon-s3 ×5
aws-cli ×2
amazon-ec2 ×1
boto ×1
collections ×1
pycharm ×1
python-2.7 ×1
python-3.x ×1