首页 > 编程问答 >在 Glue 作业中使用 python3+ 创建 CloudFront 签名 URL

在 Glue 作业中使用 python3+ 创建 CloudFront 签名 URL

时间:2024-08-05 16:04:42浏览次数:13  
标签:python amazon-web-services amazon-cloudfront aws-glue

是否可以使用 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}')

说明:

  1. 依赖项: 确保的 Glue 作业具有 boto3 cryptography 包。可以在 Glue 作业配置的“库”部分中添加这些包。

  2. 私钥: 将的 CloudFront 私钥文件 ( private_key.pem ) 上传到 Glue 作业可以访问的 S3 存储桶中,或者使用 AWS Secrets Manager 将其存储为安全字符串,并在的 Glue 作业中检索它。 切勿将的私钥硬编码到的代码中。

  3. CloudFront 密钥对 ID: 用的实际 CloudFront 密钥对 ID 替换 YOUR_CLOUDFRONT_KEY_PAIR_ID

  4. S3 URL: 使用的 S3 存储桶名称、CloudFront 分发域名和对象密钥构建 S3 对象 URL。

  5. 过期时间: 可以通过修改 expiry_hours 参数来自定义签名 URL 的过期时间。

通过这些更改,的 Glue 作业现在应该能够为的 S3 文件生成具有时间限制的 CloudFront 签名 URL。

标签:python,amazon-web-services,amazon-cloudfront,aws-glue
From: 78833343

相关文章

  • 【Python学习手册(第四版)】学习笔记14-迭代器和列表解析(一)
    个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。本文主要以通俗易懂的语言介绍迭代器(文件迭代、手动迭代iter和next等),列表解析式包括基础知识包括写法、文件上使用列表解析、扩展列表解析语法等,对列表解析不懂的同学着重推荐......
  • 如何获取部署在 Azure 应用服务上并通过 Microsoft 身份提供商进行身份验证的 Python
    我使用PythonDash包构建了一个Web应用程序,并将该应用程序部署在Azure应用服务上。Web应用程序当前通过Azure门户的应用程序服务使用Microsoft身份提供程序进行身份验证。但是如何获取登录用户的详细信息呢?在本地运行时如何验证我的Web应用程序?我当前的登录流......
  • 使用 Python 打印此图案
    1010101010101010使用python打印此我已经尝试过defprint_pattern(rows):foriinrange(rows):start_char='1'ifi%2==0else'0'pattern=''.join(start_charifj%2==0else('0'ifs......
  • python discord bot nextcord 斜线命令 更改语言
    我想根据用户的不和谐语言更改斜杠命令的名称。如果语言是韩语/서버如果语言是英语/服务器像这样。我可以使用ctx.locale更改里面的内容,但我也想更改名称和描述。我应该怎么办?当我问ChatGPT时,他们说的很奇怪,谷歌上也没有任何信息。但是有一个机器人可以根据语言......
  • 学习Python的书籍推荐--《Python编程从入门到实践》
    版权信息:书名:Python编程:从入门到实践(第3版)作者:[美]埃里克·马瑟斯(EricMatthes)译者:袁国忠评价:1.北京邮电大学副教授陈光老师是这样评价的:    编程教学之道,一是重在实践,二是循序渐进一一通过巧妙的实战项目,激发和保持学习的热情,让学习渐入佳境。在这两方......
  • 我可以将 Python 与 javascript 结合起来用于网站或应用程序吗
    我不知道如果j添加Python和javascript可以吗我尝试过。但决定在继续之前询问一下是否可以继续但是如果我只使用javascript还是只使用python会更好吗?我只需要建议或答案将Python与Javascript结合用于网站或应用程序不仅完全可行,而且也是一种非常常见的做法!二者......
  • Python 网络抓取与请求和美丽的汤被需要 javascript 阻止
    我正在尝试从网站上抓取文本。我使用简单的代码:requests.get(url_here)。我的代码直到最近才有效。现在,当我使用请求时,我收到一条消息,而不是获取网站的文本:“该网站需要启用JavaScript!您使用的浏览器不支持JavaScript,或者已关闭JavaScript。“我已验证我的浏览器确实......
  • python实现局域网及广域网私人聊天(Socket库局域网应用)
    引言在当今这个数字化时代,即时通讯已成为我们日常生活的一部分。无论是通过手机还是电脑,人们都在寻找更高效、更私密的沟通方式。想象一下,在你自己的局域网内,与朋友或同事建立一个专属的聊天室,无需担心数据泄露或者被第三方监听。本文将引导你从零开始,利用Python和Socket库......
  • 使用 python 抓取网页
    我有以下网页</div><ahref="https://www.emag.ro/laptop-lenovo-thinkbook-15-iil-cu-procesor-intel-core-i7-1065g7-pana-la-3-90-ghz-15-6-full-hd-16gb-512gb-ssd-intel-iris-plus-graphics-free-dos-mineral-grey-20sm003jrm/pd/DKBK1TMBM/#reviews-section&......
  • Python:需要有关类方法的帮助
    我有一个类“Duck”和“Dog”,如下所示:classDuck:defquack(self):print("quack")classDog:defbark(self):print("Ijustbark")以两种方式定义了另一个类并启动:case:1classItQuacks:def__init__(self,animal):......