

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# CloudShell を使用して Amazon S3 オブジェクトの署名付き URL を作成する
<a name="tutorial-presigned-url"></a>

このチュートリアルでは、Amazon S3 オブジェクトを他のユーザーと共有するために、署名付き URL を作成する方法を示します。オブジェクトの所有者は、共有時に独自のセキュリティ認証情報を指定するため、署名済み URL を受信したユーザーは誰でも期間限定でオブジェクトにアクセスできます。

## 前提条件
<a name="prerequesities-presigned"></a>
+ **AWSCloudShellFullAccess** ポリシーで提供されるアクセス許可を持つ IAM ユーザー。
+ 署名付き URL を作成するのに必要な IAM アクセス許可については、*Amazon Simple Storage Service ユーザーガイド*の「[他のユーザーとのオブジェクトの共有](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html)」を参照してください。

## ステップ 1: Amazon S3 バケットへのアクセスを許可する IAM ロールを作成する
<a name="create-role-for-sharing"></a>

このステップでは、Amazon S3 バケットへのアクセスを許可する IAM ロールを作成する方法について説明します。

1. 共有できる IAM の詳細を取得するには、`get-caller-identity` から AWS CloudShellコマンドを呼び出します。

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

   コールが正常に終了すると、コマンドラインに次のようなレスポンスが表示されます。

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

1. 前のステップで取得したユーザー情報を取得し、ある CloudFormation テンプレート追加。このテンプレートにより IAM ロールが作成されます。このロールは、共有リソースの最小特権を共同作業者に付与します。

   ```
   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.  CloudFormation テンプレートを という名前のファイルに保存します`template.yaml`。

1. テンプレートを使用してスタックをデプロイし、`deploy` コマンドを呼び出して IAM ロールを作成します。

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

## 署名付き URL の生成
<a name="generate-the-url"></a>

このステップでは、署名付き URL を生成する方法について説明します。

1. でエディタを使用して AWS CloudShell、次のコードを追加します。このコードは、フェデレーティッドユーザーが AWS マネジメントコンソールに直接アクセスできるように URL を作成します。

   ```
   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. `share.py` という名前のファイルにコードを保存します。

1. コマンドラインで以下を実行し、IAM ロールの Amazon リソースネーム (ARN) を CloudFormationから取得します。次に、Python スクリプトでこれを使用して、一時的なセキュリティ認証情報を取得します。

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

   このスクリプトは、共同作業者がクリックして AWS CloudShell の に移動できる URL を返します AWS マネジメントコンソール。共同作業者は、次の 3,600 秒 (1 時間) だけ Amazon S3 バケット内の `myfolder/` フォルダを完全に制御できます。認証情報は 1 時間後に無効になります。この期間が過ぎると、 共同作業者はバケットにアクセスできなくなります。