在AWS网站中设置S3存储桶策略时,我是否应该在我的Java代码中再次执行该代码,该代码将在Ec2实例中运行?
问题描述:
我在S3帐户通过Web浏览器设置S3斗政策在AWS网站中设置S3存储桶策略时,我是否应该在我的Java代码中再次执行该代码,该代码将在Ec2实例中运行?
https://i.stack.imgur.com/sppyr.png
我的问题是,当我在当地的笔记本电脑上运行我的web应用程序的Java代码,它上传图像S3。
final AmazonS3 s3 = new AmazonS3Client(
new AWSStaticCredentialsProvider(new BasicAWSCredentials("accessKey*",
"secretKey")));
s3.setRegion(Region.US_West.toAWSRegion());
s3.setEndpoint("s3-us-west-1.amazonaws.com");
versionId = s3.putObject(new PutObjectRequest("bucketName", name, convFile)).getVersionId();
但是当我部署我的web应用程序弹性魔豆,但没有成功上传图片到S3对象。 所以我应该以编程方式在我的Java代码中再次编写S3存储桶策略?
PS:其他详细信息,可能是有用的:Why am I able to upload to AWS S3 from my localhost, but not from my AWS Elastic BeanStalk instance?
答
你的S3斗政策过于宽松。你应该尽快删除它。
您应该创建Elastic Beanstalk应用程序将承担的IAM角色,而不是在代码中向Elastic Beanstalk应用程序显式提供凭据。该IAM角色应具有附加的IAM策略,允许适当的访问您的S3存储桶以及存储桶中的对象。
在笔记本电脑上测试时,您的应用无需在代码中拥有凭据。相反,您的应用程序应该利用AWS SDK将从运行应用程序的环境中为您检索凭据的事实。您应该使用default credential provider chain。
感谢您的回答。我现在正在阅读这些文档。我有点触动这篇文档。这个文档中提到的关键是什么S3Object s3object = s3Client.getObject( new GetObjectRequest(bucketName,key)); http://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-roles.html –
你可以在这里阅读关于键:http://docs.aws.amazon。 COM/AmazonS3 /最新的/ dev/UsingMetadata.html#对象键。 – jarmod
好的,退后一秒, “相反,你的......正在运行。” - 1)因此,无论是在笔记本电脑上运行webapp还是在AWS Ec2中运行webapp,我们都应该“使用默认的凭证提供程序链(推荐)”。 2)我创建了一个角色并创建了访问策略并将其分配给我的Ec2实例。现在我感到我应该使用哪些方法a)DefaultAWSCredentialsProviderChain b)InstanceProfileCredentialsProvider 3)角色没有accessKey&secKey? 4)如何在我的笔记本电脑之间使用AWS凭证并在Ec2中运行时保持一致? 请帮忙。 –