使用任务角色从 ECS 生成 S3 预签名 URL
S3 Pre-signed URL generation from ECS using Task role
我想创建一个 s3 预签名 url 用于将 S3 中的对象读取给我的客户。我的应用程序在 ECS 中 运行。
我想使用 ECS Task Role 创建 S3 预签名 URL 使用 python sdk 像这样
s3_client.generate_presigned_url('get_object',
Params={'Bucket': bucket_name,
'Key': object_name},
ExpiresIn=expiration)
问题:
如果客户端在任务角色凭据轮换的边界处收到预先签名的url,它不会停止工作吗?
本文提到使用永久凭证 - https://aws.amazon.com/premiumsupport/knowledge-center/presigned-url-s3-bucket-expiration/
If you created a presigned URL using a temporary token, then the URL expires when the token expires, even if the URL was created with a later expiration time.
有没有办法确保预签名 url 在凭证轮换边界附近有效。我想为预签名 url.
提供至少 10 分钟的有效期
注意:此答案还建议使用 IAM 用户凭证 - Avoid pre-signed URL expiry when IAM role key rotates
我在想 ECS 是否可以利用任务角色?
通过单独使用 ECS 任务角色,您将被限制在您签名的 URL 到期时。默认情况下,凭据持续 6 小时,但您需要验证 meta-data endpoint 以了解剩余时间。
来自元数据端点的响应示例如下,您可以看到有一个属性包含 Expiration
值。
{
"AccessKeyId": "ACCESS_KEY_ID",
"Expiration": "EXPIRATION_DATE",
"RoleArn": "TASK_ROLE_ARN",
"SecretAccessKey": "SECRET_ACCESS_KEY",
"Token": "SECURITY_TOKEN_STRING"
}
如果必须至少 10 分钟,您可以通过创建另一个角色(具有权限的角色)然后将 STS 与 assume-role 结合使用来实现。您可以传递的参数之一是 duration-seconds
,它最多可指定 12 小时。
如果你这样做,你就可以承担这个角色并生成预签名的 URL,它可以用于你指定的 duration-seconds
的长度。您的任务角色将有权代入该角色,这意味着您不需要 IAM 用户。
这仅在您需要 link 短于 12 小时的情况下有效,否则您将被限制为 IAM 用户。
If a client receives a presigned url right at the boundary of task role credential rotation wont it stop working
是的。预签名 url 链接到创建它们的 IAM 实体 。因此,在您的情况下,如果您在 IAM 角色到期之前生成 url,则 url 也将到期。无论 url 本身的到期时间如何,都会发生这种情况。
为避免这种情况,应使用 IAM 用户 生成预签名的 url,因为 IAM 用户的凭证是永久性的,这与 IAM 角色的凭证不同。
您还可以通过将其增加到 12 小时来减少角色凭据过期时间的影响,例如:
我想创建一个 s3 预签名 url 用于将 S3 中的对象读取给我的客户。我的应用程序在 ECS 中 运行。
我想使用 ECS Task Role 创建 S3 预签名 URL 使用 python sdk 像这样
s3_client.generate_presigned_url('get_object',
Params={'Bucket': bucket_name,
'Key': object_name},
ExpiresIn=expiration)
问题:
如果客户端在任务角色凭据轮换的边界处收到预先签名的url,它不会停止工作吗?
本文提到使用永久凭证 - https://aws.amazon.com/premiumsupport/knowledge-center/presigned-url-s3-bucket-expiration/
If you created a presigned URL using a temporary token, then the URL expires when the token expires, even if the URL was created with a later expiration time.
有没有办法确保预签名 url 在凭证轮换边界附近有效。我想为预签名 url.
提供至少 10 分钟的有效期注意:此答案还建议使用 IAM 用户凭证 - Avoid pre-signed URL expiry when IAM role key rotates
我在想 ECS 是否可以利用任务角色?
通过单独使用 ECS 任务角色,您将被限制在您签名的 URL 到期时。默认情况下,凭据持续 6 小时,但您需要验证 meta-data endpoint 以了解剩余时间。
来自元数据端点的响应示例如下,您可以看到有一个属性包含 Expiration
值。
{
"AccessKeyId": "ACCESS_KEY_ID",
"Expiration": "EXPIRATION_DATE",
"RoleArn": "TASK_ROLE_ARN",
"SecretAccessKey": "SECRET_ACCESS_KEY",
"Token": "SECURITY_TOKEN_STRING"
}
如果必须至少 10 分钟,您可以通过创建另一个角色(具有权限的角色)然后将 STS 与 assume-role 结合使用来实现。您可以传递的参数之一是 duration-seconds
,它最多可指定 12 小时。
如果你这样做,你就可以承担这个角色并生成预签名的 URL,它可以用于你指定的 duration-seconds
的长度。您的任务角色将有权代入该角色,这意味着您不需要 IAM 用户。
这仅在您需要 link 短于 12 小时的情况下有效,否则您将被限制为 IAM 用户。
If a client receives a presigned url right at the boundary of task role credential rotation wont it stop working
是的。预签名 url 链接到创建它们的 IAM 实体 。因此,在您的情况下,如果您在 IAM 角色到期之前生成 url,则 url 也将到期。无论 url 本身的到期时间如何,都会发生这种情况。
为避免这种情况,应使用 IAM 用户 生成预签名的 url,因为 IAM 用户的凭证是永久性的,这与 IAM 角色的凭证不同。
您还可以通过将其增加到 12 小时来减少角色凭据过期时间的影响,例如: