このトピックでは、Resource Access Management (RAM) コンソールとSDKを使用してSecurity Token Service (STS) トークンを取得し、Function Computeのリソースを表示する権限をAlibaba Cloudアカウント全体に付与する方法について説明します。

エンタープライズAはFunction Computeを有効化しており、エンタープライズBはFunction Computeリソースを管理する必要があります。 エンタープライズAには次の要件があります。
  • エンタープライズAはビジネスシステムに集中でき、Function Computeの所有者としてのみ機能します。 さらに、エンタープライズAは、サービスや機能の作成など、指定されたリソースの管理をエンタープライズBに許可できます。
  • 従業員がエンタープライズBに参加または離脱する場合、エンタープライズAは権限を変更する必要はありません。 エンタープライズBは、RAMユーザーにエンタープライズAのリソースに対するきめ細かい権限を付与できます。
  • エンタープライズAとエンタープライズBの間の契約が終了すると、エンタープライズAはエンタープライズBに付与されている権限を取り消すことができます。

RAMコンソールの使用

たとえば、エンタープライズAは、エンタープライズBの従業員がFunction Computeのすべてのサービスにアクセスすることを許可する必要があります。 エンタープライズAにはアカウントAという名前のAlibaba Cloudアカウントがあり、エンタープライズBにはアカウントBという名前のAlibaba Cloudアカウントがあります。
  • アカウントAのIDは123456789012 **** で、アカウントのエイリアスはcompany-aです。
  • アカウントBのIDは134567890123 **** で、アカウントのエイリアスはcompany-bです。

ステップ1: アカウントaを使用してRAMロールを作成する

アカウントAを使用してRAMロールを作成し、RAMロールに必要な権限を付与してから、アカウントBにこのロールを引き受けることを許可します。

  1. アカウントAを使用してRAMコンソールにログインします。
  2. 左側のナビゲーションウィンドウで、[ID] > [ロール] を選択します。
  3. [ロール] ページで、[ロールの作成] をクリックします。
  4. [ロールの作成] パネルで、[Alibaba Cloudアカウント] を選択し、[ロールタイプの選択][次へ] をクリックします。
  5. [ロールの設定] ステップで、[RAMロール名] フィールドにfc-adminなどのRAMロール名を入力し、[その他のAlibaba Cloudアカウント] を選択し、アカウントBのIDを入力します。
  6. [OK] をクリックします。
    [完了] ステップに [ロールが作成されました] メッセージが表示された場合、RAMロールが作成されます。 RAMロールの作成後、RAMロールの詳細ページの基本情報セクションでRAMロールに関する情報を表示できます。
    • この例では、RAMロールのAlibaba Cloudリソース名 (ARN) はacs:ram::123456789012 ****:role/fc-adminです。
    • 次のスクリプトは、RAMロールの信頼ポリシーを示しています。
      このポリシーは、アカウントBに属するRAMユーザーのみがRAMロールを引き受けることができることを示します。
      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "RAM": [
                "acs:ram::134567890123****:root"
              ]
            }
          }
        ],
        "Version": "1"
      }
  7. アカウントAを使用して、AliyunFCReadOnlyAccessポリシーをRAMロールfc-adminにアタッチします。 詳細については、「RAM ロールへの権限付与」をご参照ください。

ステップ2: アカウントBを使用してRAMユーザーを作成する

  1. アカウントBを使用してRAMユーザーtest-demoを作成します。 詳細については、「RAM ユーザーの作成」をご参照ください。
  2. アカウントBを使用して、AliyunSTSAssumeRoleAccessポリシーをRAMユーザーにアタッチします。 次に、RAMユーザーはRAMロールを引き受けることができます。 詳細については、「RAM ユーザーへの権限付与」をご参照ください。

ステップ3: ログインのIDを切り替える

アカウントBに属するRAMユーザーがアカウントA内のリソースにアクセスする必要がある場合、アカウントBを使用してRAMユーザーに必要な権限を付与できます。 アカウントBに属するRAMユーザーは、アカウントA内のRAMロールを引き受けて、アカウントA内のリソースにアクセスします。次の手順を実行できます。

  1. アカウントBに属するRAMユーザーを使用して、RAMコンソールにログインします。 詳細については、「RAM ユーザーログイン」をご参照ください。
  2. 右上隅のプロファイル画像にポインターを移動し、[IDの切り替え] をクリックします。
  3. [ロールの切り替え] ページで、パラメーターを設定します。
    詳細については、「RAM ロールの引き受け」をご参照ください。

付与された権限を取り消す (オプション)

エンタープライズAとエンタープライズBの間の契約が終了すると、エンタープライズAはアカウントBに付与された権限を取り消すことができます。その後、アカウントBに属するすべてのRAMユーザーはRAMロールの権限を持ちません。 次のステップを実行することができます。

  1. アカウントAを使用してRAMコンソールにログインします。
  2. 左側のナビゲーションウィンドウで、[ID] > [ロール] を選択します。
  3. RAMロールfc-adminを見つけ、[操作] 列の [削除] をクリックします。 [OK] をクリックします。
    重要 RAMロールを削除する前に、RAMロールにアタッチされているポリシーをデタッチする必要があります。 詳細については、「RAM ロールの権限の削除」をご参照ください。

SDKの使用

STSを使用して、Function Computeへの一時的なアクセスを許可できます。 STSは、クラウドコンピューティングユーザーにSTSトークンを提供するwebサービスです。 たとえば、Alibaba CloudアカウントBには、Alibaba CloudアカウントA内のFunction Computeのすべてのサービスを表示する権限が必要です。

  1. 次のサンプルコードを実行して、STSトークンを取得します。 詳細については、「概要」および「ロールの引き受け(AssumeRole)」をご参照ください。
    const Core = require('@alicloud/pop-core');
     
     // Alibaba Cloudクライアントを構築してリクエストを開始します。 
     // クライアントを構築するときは、AccessKey IDとAccessKey secretを指定します。 
     var client = new Core({
       accessKeyId: '<accessKeyId>',
       accessKeySecret: '<accessSecret>' 、
       endpoint: 'https:// sts.aliyuncs.com '、
       apiVersion: '2015-04-01'
     });
     
     // リクエストパラメーターを指定します。 
     var params ={
       "RegionId": "cn-hangzhou",
       "RoleArn": "<RoleARN>" 、
       "RoleSessionName": "<RoleSessionName>"
     }
     
     var requestOption = {
       method: 'POST'
     };
     
     // リクエストを開始し、レスポンスを取得します。 
     client.request('AssumeRole', params, requestOption).then((result) => {
       console.log(JSON.stringify (結果));
     }, (ex) => {
       console.log(ex);
     })          
     
    # coding=utf-8
    # encoding: utf-8
    import json
    from aliyunsdkcore import client as AliyunSDK
    from aliyunsdksts.request.v20150401 import AssumeRoleRequest
    
    def main():    
        AccessKeySecret='<accessSecret>'
        AccessKeyId='<accessKeyId>'
        regionId ='cn-hangzhou'
    
        sts_client = AliyunSDK.AcsClient (
                AccessKeyId、
                AccessKeySecret、
                regionId)
        request = AssumeRoleRequest.AssumeRoleRequest()
        request.set_RoleArn("<RoleARN>")
        request.set_RoleSessionName('fc-python-sdk')
        response = sts_client.do_action_with_exception (リクエスト)
        response_json = json.loads (response)
        result = json.dumps(response_json['Credentials'])
        print(result)
    if __name__ == "__main__":
        メイン()
     
    期待される出力:
    {
      "RequestId": "964E0EC5-575B-4FF5-8FD0-D4BD8025602A" 、
      "AssumedRoleUser": {
        "Arn": "acs:ram::****:role/wss/wss" 、
        "AssumedRoleId": "***********:wss"
      },
      "Credentials": {
        "SecurityToken": "************" 、
        "AccessKeyId": "STS.*************" 、
        "AccessKeySecret": "************" 、
        "Expiration": 「2021-05-28T11:23:19Z」
      }
    }
    STSトークンを取得するときによくある質問の詳細については、「STS に関するよくある質問」をご参照ください。
  2. Alibaba CloudアカウントB内の次の関数コードを変更して、Alibaba CloudアカウントBに属するRAMユーザーに、Alibaba CloudアカウントA内のfunction Computeのすべてのサービスを表示する権限を付与します。
    const FC = require('@ alicloud/fc2');
    // クライアントを構築します。 
    const client = new FC(<accountID>, {
        region: <yourRegionID> 、
        accessKeyID: <yourAccessKeyID> 、
        securityToken: <yourSecurityToken> 、
        accessKeySecret: <yourAccessKeySecret>
    });
    // サービスの照会。 
    client.listServices().then(res => {
        console.log(JSON.stringify(res, null, ''))
    }).catch(ex=> console.log(ex)
    重要 STSトークンが割り当てられるロールには、サービスを照会する権限が必要です。