【问题标题】:EC2 User Data to fetch S3 ObjectEC2 用户数据以获取 S3 对象
【发布时间】:2017-01-09 20:28:08
【问题描述】:

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

我想做的是实现一个用户数据脚本,
这将从 S3 位置下载 EC2 上的 .jar。
只有在公开 .jar 时才能获取 .jar

如果我不将 S3 上的 .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

【问题讨论】:

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


    【解决方案1】:

    请参阅文档以更好地了解 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 CLI 可执行文件已安装在/usr/local/bin/ 中,并且您希望将下载的文件写入/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 用法。

    【讨论】:

    • 但是我需要自动获取.jar,因为它是在自动缩放上,那么我该如何实现呢?我曾经使用用户数据 bash 脚本来获取 .jar。
    • @AniruddhaRaje aws-cli 适用于自动化,而且使用起来相当简单。我添加了示例用法和答案链接。在您的用户数据脚本中包含该命令。
    • 感谢您的示例,我不需要密钥路径位,对吧?因为我正在使用这个角色?
    • key 是对象的路径和文件名。从 S3 文档中,"A key is the unique identifier for an object within a bucket. Every object in a bucket has exactly one key." 这指定了您想要的文件,所以,是的,您将需要这个。这不是您的 AWS 访问密钥 ID。
    • 我在问题中添加了一个用户数据脚本和你的建议,你能确认它是否正确,或者需要任何修改吗?
    【解决方案2】:

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

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

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

    CLI 是一个 Python 应用程序,它使用适用于 AWS 的 Python 开发工具包。它知道如何检索分配给实例的凭据,因为它是使用角色启动的。

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

    【讨论】:

    • 我一直在使用用户数据 bash 脚本从 S3 获取公开的 .jar,我如何使用您的 cli 命令?因为我希望流程自动化?
    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多