是否可以使用 python3+ 为 Glue Job 中 S3 文件中的一个特定文件创建具有一定时间限制的 CloudFront 签名 URL?
我看到可以在 Lambda 中做到这一点,但在 Python 文档中找不到任何内容,特别是胶水工作。任何人都可以提供一些提示吗?
def load_private_key(key_path):
with open(key_path, 'rb') as key_file:
return serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
def rsa_signer(message):
private_key = load_private_key('private_key.pem')
signature = private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
return signature
def get_signer_url(url):
if key_pair_id:
cf_signer = CloudFrontSigner(key_pair_id, rsa_signer)
current_date = datetime.now()
retention_period = current_date + timedelta(days=93)
signed_url = cf_signer.generate_presigned_url(url, date_less_than=retention_period)
print(signed_url)
return signed_url
url = "https://distr.cloudfront.net/path/to/resource"
signed_url = get_signer_url(url)
收到诸如模块“cryptography.hazmat.primitives.padding”没有属性“PSS”或未找到“散列”等错误。尽管我使用的是最新版本。我对所有这些都很陌生,希望获得一些提示或建议。
可以使用 Python 在 Glue 作业中为 S3 文件中的特定文件创建具有时间限制的 CloudFront 签名 URL。走在正确的轨道上,但需要进行一些调整。
在代码中遇到的错误是由于
cryptography
包的版本错误造成的。需要
cryptography
2.1.4 或更高版本才能使用
padding.PSS
。
以下是如何在 Glue 作业中使用 Python 3+ 创建 CloudFront 签名 URL 的完整示例:
from datetime import datetime, timedelta
from urllib.parse import urlparse
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.exceptions import InvalidSignature
from botocore.signers import CloudFrontSigner
def rsa_signer(message):
"""使用 RSA 私钥对消息进行签名"""
with open('private_key.pem', 'rb') as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
return private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA1()), # 使用 SHA1 进行签名
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA1() # 使用 SHA1 进行签名
)
def get_cloudfront_signed_url(s3_url, key_pair_id, expiry_hours=24):
"""生成具有时间限制的 CloudFront 签名 URL。
Args:
s3_url (str): S3 对象的 URL。
key_pair_id (str): 用于签署 URL 的 CloudFront 密钥对 ID。
expiry_hours (int, optional): 签名 URL 的有效时间(以小时为单位)。默认值为 24。
Returns:
str: CloudFront 签名 URL。
"""
# 创建 CloudFront 签名器
cf_signer = CloudFrontSigner(key_pair_id, rsa_signer)
# 获取当前时间并计算过期时间
current_time = datetime.utcnow()
expiry_time = current_time + timedelta(hours=expiry_hours)
# 解析 S3 URL
parsed_url = urlparse(s3_url)
# 生成签名 URL
signed_url = cf_signer.generate_presigned_url(
parsed_url.geturl(),
date_less_than=expiry_time
)
return signed_url
# ---- Glue 作业中的示例用法 ----
# 替换为的 CloudFront 分发域名
distribution_domain = 'your-cloudfront-distribution.cloudfront.net'
# 替换为的 S3 对象密钥
s3_object_key = 'path/to/your/file.txt'
# 构建 S3 URL
s3_url = f'https://{distribution_domain}/{s3_object_key}'
# 替换为的 CloudFront 密钥对 ID
key_pair_id = 'YOUR_CLOUDFRONT_KEY_PAIR_ID'
# 生成签名 URL
signed_url = get_cloudfront_signed_url(s3_url, key_pair_id)
print(f'CloudFront 签名 URL: {signed_url}')
说明:
-
依赖项: 确保的 Glue 作业具有
boto3
和cryptography
包。可以在 Glue 作业配置的“库”部分中添加这些包。 -
私钥: 将的 CloudFront 私钥文件 (
private_key.pem
) 上传到 Glue 作业可以访问的 S3 存储桶中,或者使用 AWS Secrets Manager 将其存储为安全字符串,并在的 Glue 作业中检索它。 切勿将的私钥硬编码到的代码中。 -
CloudFront 密钥对 ID: 用的实际 CloudFront 密钥对 ID 替换
YOUR_CLOUDFRONT_KEY_PAIR_ID
。 -
S3 URL: 使用的 S3 存储桶名称、CloudFront 分发域名和对象密钥构建 S3 对象 URL。
-
过期时间: 可以通过修改
expiry_hours
参数来自定义签名 URL 的过期时间。
通过这些更改,的 Glue 作业现在应该能够为的 S3 文件生成具有时间限制的 CloudFront 签名 URL。
标签:python,amazon-web-services,amazon-cloudfront,aws-glue From: 78833343