我已经包含了一些将war文件上传到s3存储桶的代码(如果不存在则首先创建存储桶)。然后,它使用刚刚上传的war文件创建一个弹性beanstalk应用程序版本。
假设/tmp/server_war
存在并且是有效的war文件。以下代码将失败并显示boto.exception.BotoServerError: BotoServerError: 400 Bad Request
:
#!/usr/bin/env python
import time
import boto
BUCKET_NAME = 'foo_bar23498'
s3 = boto.connect_s3()
bucket = s3.lookup(BUCKET_NAME)
if not bucket:
bucket = s3.create_bucket(BUCKET_NAME, location='')
version_label = 'server%s' % int(time.time())
# uplaod the war file
key_name = '%s.war' % version_label
s3key = bucket.new_key(key_name)
print 'uploading war file...'
s3key.set_contents_from_filename('/tmp/server.war',
headers={'Content-Type' : 'application/x-zip'})
# uses us-east-1 by default
eb = boto.connect_beanstalk()
eb.create_application_version(
application_name='TheApp',
version_label=version_label,
s3_bucket=BUCKET_NAME,
s3_key=key_name,
auto_create_application=True)
会导致什么?
答案 0 :(得分:4)
此错误的一个可能原因是存储桶名称。显然,您可以拥有包含下划线的s3存储桶名称,但是您无法使用这些存储桶中的密钥创建应用程序版本。
如果您将上面的第四行更改为
BUCKET_NAME ='foo-bar23498'
它应该有用。
是的,回答我自己的问题感觉很奇怪......显然这是堆栈溢出这种情况的推荐方法。我希望我能为其他人节省大量的调试时间。