

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Creación de una URL prefirmada para objetos de Amazon S3 mediante CloudShell
<a name="tutorial-presigned-url"></a>

En este tutorial, se muestra cómo crear una URL prefirmada para compartir un objeto de Amazon S3 con otros. Como los propietarios de los objetos especifican sus propias credenciales de seguridad al compartir, cualquier persona que reciba la URL prefirmada puede acceder al objeto durante un tiempo limitado.

## Requisitos previos
<a name="prerequesities-presigned"></a>
+ Un usuario de IAM con los permisos de acceso proporcionados por la **AWSCloudShellFullAccess**política.
+ Para conocer los permisos de IAM necesarios para crear una URL prefirmada, consulte [Compartir un objeto con otros](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html) en la *Guía del usuario de Amazon Simple Storage Service*.

## Paso 1: crear un rol de IAM para conceder acceso al bucket de Amazon S3
<a name="create-role-for-sharing"></a>

Este paso describe cómo crear un rol de IAM para conceder acceso a un bucket de Amazon S3.

1. Para obtener los detalles de IAM que se puedan compartir, llame al comando `get-caller-identity` desde AWS CloudShell.

   ```
   aws sts get-caller-identity
   ```

   Si la llamada se realiza correctamente, la línea de comandos muestra una respuesta similar a la siguiente:

   ```
   {
       "Account": "123456789012", 
       "UserId": "AROAXXOZUUOTTWDCVIDZ2:redirect_session", 
       "Arn": "arn:aws:sts::531421766567:assumed-role/Feder08/redirect_session"
   }
   ```

1. Tome la información de usuario que obtuvo en el paso anterior y agréguela a una plantilla de CloudFormation . Esta plantilla crea un rol de IAM. Este rol otorga a su colaborador los permisos con los privilegios mínimos para los recursos compartidos.

   ```
   Resources:
     CollaboratorRole:
       Type: AWS::IAM::Role
       Properties: 
         AssumeRolePolicyDocument: 
           Version: 2012-10-17		 	 	 
           Statement: 
             - Effect: Allow
               Principal:
                 AWS: "arn:aws:iam::531421766567:role/Feder08"
               Action: "sts:AssumeRole"
         Description: Role used by my collaborators
         MaxSessionDuration: 7200
     CollaboratorPolicy:
       Type: AWS::IAM::Policy
       Properties: 
         PolicyDocument: 
           Version: 2012-10-17		 	 	 
           Statement:
             - Effect: Allow
               Action:
                 - 's3:*'
               Resource: 'arn:aws:s3:::<YOUR_BUCKET_FOR_FILE_TRANSFER>'
               Condition:
                 StringEquals:
                   s3:prefix:
                    - "myfolder/*"
         PolicyName: S3ReadSpecificFolder
         Roles: 
           - !Ref CollaboratorRole
   Outputs:
     CollaboratorRoleArn:
       Description: Arn for the Collaborator's Role
       Value: !GetAtt CollaboratorRole.Arn
   ```

1. Guarde la CloudFormation plantilla en un archivo que lleve su nombre`template.yaml`.

1. Use la plantilla para implementar la pila y crear el rol de IAM mediante una llamada al comando `deploy`.

   ```
   aws cloudformation deploy --template-file ./template.yaml --stack-name CollaboratorRole --capabilities CAPABILITY_IAM
   ```

## Generar una URL prefirmada
<a name="generate-the-url"></a>

En este paso se describe cómo generar la URL prefirmada.

1. Con el editor incluido AWS CloudShell, añade el siguiente código. Este código crea una URL que facilita a los usuarios federados acceso directo a la AWS Management Console.

   ```
   import urllib, json, sys
   import requests
   import boto3
   import os
   
   def main():
     sts_client = boto3.client('sts')
     assume_role_response = sts_client.assume_role(
         RoleArn=os.environ.get(ROLE_ARN),
         RoleSessionName="collaborator-session"
     )
     credentials = assume_role_response['Credentials']
     url_credentials = {}
     url_credentials['sessionId'] = credentials.get('AccessKeyId')
     url_credentials['sessionKey'] = credentials.get('SecretAccessKey')
     url_credentials['sessionToken'] = credentials.get('SessionToken')
     json_string_with_temp_credentials = json.dumps(url_credentials)
     print(f"json string {json_string_with_temp_credentials}")
   
     request_parameters = f"?Action=getSigninToken&Session={urllib.parse.quote(json_string_with_temp_credentials)}"
     request_url = "https://signin.aws.amazon.com/federation" + request_parameters
     r = requests.get(request_url)
     signin_token = json.loads(r.text)
     request_parameters = "?Action=login" 
     request_parameters += "&Issuer=Example.org" 
     request_parameters += "&Destination=" + urllib.parse.quote("https://us-west-2.console.aws.amazon.com/cloudshell")
     request_parameters += "&SigninToken=" + signin_token["SigninToken"]
     request_url = "https://signin.aws.amazon.com/federation" + request_parameters
   
     # Send final URL to stdout
     print (request_url)
   
   if __name__ == "__main__":
     main()
   ```

1. Guarde el código en un archivo denominado `share.py`.

1. Ejecute lo siguiente desde la línea de comandos para recuperar el nombre de recurso de Amazon (ARN) del rol de IAM de CloudFormation. A continuación, úselo en el script de Python para obtener credenciales de seguridad temporales.

   ```
   ROLE_ARN=$(aws cloudformation describe-stacks --stack-name CollaboratorRole --query "Stacks[*].Outputs[?OutputKey=='CollaboratorRoleArn'].OutputValue" --output text) python3 ./share.py 
   ```

   El script devuelve una URL en la que un colaborador puede hacer clic para acceder a ella AWS CloudShell . AWS Management Console El colaborador tiene el control total de la carpeta `myfolder/` del bucket de Amazon S3 durante los próximos 3600 segundos (1 hora). Las credenciales caducan después de una hora. Transcurrido este tiempo, el colaborador ya no podrá acceder al bucket. 