Tengo un depósito my-bucket-name y quiero otorgar acceso temporal a algún file.pdf en folder-name . Por defecto, obtengo el siguiente enlace usando boto3:
https://my-bucket-name.s3.amazonaws.com/folder-name/file.pdf?AWSAccessKeyId=<key>&Signature=<signature>&x-amz-security-token=<toke>&Expires=<time> Pero también tengo un alias de DNS, my.address.com está asignado a my-bucket-name.s3.amazonaws.com . Por supuesto, si lo estoy usando directamente, obtuve SignatureDoesNotMatch de Amazon. Así que estoy usando el siguiente código para generar un enlace prefirmado:
from botocore.client import Config kwargs = {} kwargs['endpoint_url'] = f'https://my.address.com' kwargs['config'] = Config(s3={'addressing_style': 'path'}) s3_client = boto3.client('s3', **kwargs) url = s3_client.generate_presigned_url(ClientMethod='get_object', Params={ 'Bucket': 'my-bucket-name', 'Key': 'folder-name/file.pdf' }, ExpiresIn=URL_EXPIRATION_TIME)Como resultado me devuelve el siguiente enlace:
https://my.address.com/my-bucket-name/folder-name/file.pdf?AWSAccessKeyId=<key>&Signature=<signature>&x-amz-security-token=<toke>&Expires=<time>Hay dos problemas con esto:
my-bucket-name/ debe omitirse <Code>SignatureDoesNotMatch</Code> <Message> The request signature we calculated does not match the signature you provided. Check your key and signing method. </Message>Esas son las preguntas:
Actualmente estoy un poco perdido en los documentos de Amazon. También soy nuevo en todo esto de AWS.
No es posible ocultar el nombre del depósito en una URL prefirmada de Amazon S3. Esto se debe a que la solicitud se realiza al depósito. La firma simplemente autoriza la solicitud.
Una forma de hacerlo es usar Amazon CloudFront , con el depósito como origen. Puede asociar un nombre de dominio con la distribución de CloudFront, que no está relacionado con el Origen donde CloudFront obtiene su contenido.
Amazon CloudFront admite URL prefirmadas. Puede dar acceso a CloudFront al depósito S3 a través de una Identidad de acceso de origen (OAI) y luego configurar la distribución para que sea privada. Luego, acceda al contenido a través de URL prefirmadas de CloudFront. Tenga en cuenta que todo el contenido de la distribución sería privado, por lo que necesitaría dos distribuciones de CloudFront (una pública y otra privada) o solo usaría CloudFront para la parte privada (y continuaría usando Direct-to-S3 para la parte pública). ).
Si todo el sitio web es privado, podría usar una cookie con CloudFront en lugar de tener que generar URL prefirmadas para cada URL.
Hasta donde yo sé, no puede tener una URL prefirmada sin exponer el nombre del depósito. Sí, no puede acceder a un nombre de dominio personalizado asignado a la URL del depósito S3 a través de https. Porque cuando accede a https://example.com y example.com está asignado a my-bucket-name.s3.amazonaws.com , S3 no puede descifrar el tráfico SSL. Consulte esta página de documentos de AWS, sección Limitación.