用于获取S3对象的EC2用户数据

时间:2016-09-01 20:19:53

标签: ubuntu amazon-web-services amazon-s3 amazon-ec2

我在公共子网中有 EC2实例
EC2附加了 S3完全访问角色 我在S3文件夹位置有一个 .jar S3 Bucket具有默认权限,在创建存储桶时应用这些权限。

我想要做的是实现用户数据脚本,
这将从S3 位置下载EC2上的.jar 只有当我将.jar公开
时,我才能忘记.jar,

如果我没有在S3 Public上制作.jar,我无法从EC2中获取它
出于安全原因,我不想将.jar公开。

如果不使.jar公开,我应该怎么做才能从S3获取.jar?

这是我的用户数据脚本 -

#! /bin/bash

sudo timedatectl set-timezone Asia/Kuala_Lumpur

sudo rm -rf /home/ubuntu/jarName.jar

sudo rm -rf /home/ubuntu/nohup.out

/usr/local/bin/aws s3api get-object --bucket myDemoBucket --key folderNameDemo/jarName.jar /home/ubuntu/jarName.jar

cd /home/ubuntu/

sudo nohup java -jar -Dspring.profiles.active=uat jarName.jar > nohup.out &

exit

2 个答案:

答案 0 :(得分:4)

请参阅文档以更好地了解EC2 Instance IAM Roles的工作原理。

S3和其他AWS API无法直接识别实例。请求仍必须签名。 IAM实例角色为您的实例提供了一个易于访问,总是新鲜的相对短暂的临时凭证集 - 熟悉的访问密钥ID和访问密钥,以及还必须用于签名和提交请求的令牌

  • 使用这三个元素,您可以在运行时生成签名URL并将其传递给wget或
  • 您可以使用aws-cli获取文件,该文件内置支持获取和使用实例角色凭据,或者
  • 如果在您的环境中有意义,您可以将存储桶策略配置为信任实例在连接到S3时将使用的IP地址,并允许来自该地址的任何请求成功。如果您使用的是NAT实例或NAT网关,或者您在实例上使用弹性IP地址,则这很简单。如果为S3配置VPC端点,则不支持此功能。

上述最简单的选择可能就是使用aws-cli。

/usr/local/bin/aws s3api get-object --bucket example-bucket --key path/in/s3/to/my_object.txt /tmp/local-file-name.txt

请注意,在脚本中,为命令和文件使用完全限定的路径通常是个好主意,因为当前环境的路径和工作目录可能不知道或不符合预期。在这种情况下,我假设aws中已安装/usr/local/bin/ CLI可执行文件,并且您要将下载的文件写入/tmp/。根据您的环境自定义这些。

另请参阅http://docs.aws.amazon.com/cli/latest/userguide/installing.html了解安装和http://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html了解此应用程序的aws-cli的使用情况。

答案 1 :(得分:2)

通过wget检索文件不会传递您的身份。默认情况下,Amazon S3存储桶中的内容是私有的,匿名用户无法使用。

您可以通过API调用或使用AWS Command-Line Interface (CLI)来访问存储分区,例如:

aws s3 cp s3://BUCKET-NAME/FILENAME.zip .

CLI是一个使用Python SDK for AWS的Python应用程序。它知道如何检索由于使用角色启动而分配给实例的凭据。

检查实例上是否安装了CLI。如果没有,请在使用前进行安装。