このトピックでは、Resource Access Management (RAM) コンソールまたは SDK を使用して、セキュリティトークンサービス (STS) トークンを使用して Alibaba Cloud アカウント間で権限を付与する方法について説明します。 承認された Alibaba Cloud アカウントは、Function Compute で承認アカウントのリソースを表示および管理できます。
シナリオ
企業 A は Function Compute をアクティブ化しており、企業 B に Function Compute リソースの管理を要求しています。 企業 A には次の要件があります。
企業 A はビジネスシステムに集中でき、Function Compute リソースの所有者としてのみ機能できます。 さらに、企業 A は、サービスや関数の作成など、指定されたリソースを管理する権限を企業 B に付与できます。
企業 B に従業員が入社または退社した場合、企業 A は権限を変更する必要はありません。 企業 B は、企業 A のリソースに対して RAM ユーザーに詳細な権限を付与できます。
企業 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 にこのロールを引き受ける権限を付与します。 [他の Alibaba Cloud アカウント] フィールドにアカウント B を入力する必要があります。
アカウント A を使用して RAM コンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、[ロールの作成] をクリックします。

[ロールの作成] ページで、[信頼できるエンティティの種類] パラメーターを [Alibaba Cloud アカウント] に設定し、Alibaba Cloud アカウントを指定して、[OK] をクリックします。

[ロールの作成] ダイアログボックスで、[ロール名] パラメーターを設定し、[OK] をクリックします。
アカウント A を使用して、AliyunFCReadOnlyAccess ポリシーを作成した RAM ロールにアタッチします。 RAM ロールに権限を付与する方法の詳細については、「RAM ロールに権限を付与する」をご参照ください。
作成した RAM ロールをクリックします。ロール詳細ページで、[信頼ポリシー] タブをクリックし、アカウント B 内の RAM ユーザーが RAM ロールを偽装できるように RAM ロールの信頼ポリシーを編集します。
accountidの値をアカウント B の ID に変更します。変更後のポリシーは、アカウント B 内の RAM ユーザーのみが RAM ロールを偽装できることを示します。
ステップ 2: アカウント B を使用して RAM ユーザーを作成する
アカウント B を使用して、企業 B の従業員用に RAM ユーザーを作成します。 詳細については、「RAM ユーザーを作成する」をご参照ください。
アカウント B を使用して、AliyunSTSAssumeRoleAccess ポリシーを作成した RAM ユーザーにアタッチします。 その後、RAM ユーザーは RAM ロールを引き受けることができます。 RAM ユーザーに権限を付与する方法の詳細については、「RAM ユーザーに権限を付与する」をご参照ください。
ステップ 3: ログイン ID を切り替える
アカウント B に属する RAM ユーザーがアカウント A のリソースにアクセスする必要がある場合、アカウント B を使用して RAM ユーザーに必要な権限を付与できます。 アカウント B に属する RAM ユーザーは、アカウント A のリソースにアクセスするためにアカウント A の RAM ロールを引き受けます。 手順:
アカウント B の RAM ユーザーを使用して、RAM コンソールにログインします。
詳細については、「RAM ユーザーとして Alibaba Cloud 管理コンソールにログインする」をご参照ください。
右上隅のプロファイル写真にポインターを合わせ、[ID の切り替え] をクリックします。[ロールの切り替え] ダイアログボックスで、以下の手順を実行し、[送信] をクリックします。
RAM ロールが属する Alibaba Cloud アカウントのアカウントエイリアス(企業エイリアス)、デフォルトドメイン名、または ID を入力します。詳細については、「デフォルトドメイン名を表示および変更する」をご参照ください。
RAM ロールの名前を入力します。詳細については、「RAM ロールの情報を表示する」をご参照ください。

詳細については、「RAM ロールを引き受ける」をご参照ください。
次に、アカウント B の RAM ユーザーとして Function Compute コンソール にログインします。 アカウント A のすべてのリソースが表示されます。
(オプション) 付与された権限を取り消す
企業 A と企業 B の協力関係が終了した場合、企業 A は企業 B に付与された権限を取り消すことができます。 アカウント B 用に作成された RAM ロールを削除することで、付与された権限を取り消すことができます。 その後、アカウント B 内の RAM ユーザーはロールを引き受けることができなくなります。 手順:
アカウント A を使用して RAM コンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、削除する RAM ロールを見つけ、[アクション] 列の [ロールの削除] をクリックします。
[ロールの削除] ダイアログボックスで、RAM ロールの名前を入力し、[ロールの削除] をクリックします。
RAM ロールを削除する前に、RAM ロールにアタッチされているポリシーをデタッチする必要があります。 詳細については、「RAM ロールから権限を取り消す」をご参照ください。
SDK の使用
STS を使用して、Function Compute への一時的なアクセスを承認できます。 STS は、クラウドコンピューティングユーザーに STS トークンを提供する Web サービスです。 次の例は、アカウント B がアカウント A のすべてのサービスを表示する権限を取得する方法を示しています。
始める前に
手順
アカウント A を使用して RAM ロールを作成し、アカウント B を信頼できるアカウントとして選択します。
詳細については、「信頼されている Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。
アカウント B を使用して RAM ユーザーを作成し、RAM ユーザーに RAM ロールを偽装する権限を付与します。
詳細については、「RAM ユーザーを作成する」および「RAM ユーザーに権限を付与する」をご参照ください。
アカウント B の関数に次のサンプルコードを入力して、一時的なアクセス認証情報を取得します。詳細については、「STS SDK 概要」および「AssumeRole」をご参照ください。
const Core = require('@alicloud/pop-core'); // リクエストを開始するために使用される Alibaba Cloud クライアントを構築します。 /* Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。これらの資格情報を使用して Function Compute で操作を実行することは、リスクの高い操作です。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを使用することをお勧めします。 AccessKey ID と AccessKey シークレットをプロジェクトコードに保存しないことをお勧めします。保存した場合、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。 この例では、ID 検証を実装するために、AccessKey ペアは環境変数に格納されています。 サンプルコードを実行する前に、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を設定します。 ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数は、Function Compute のランタイムで実行権限を設定した後に自動的に設定されます。 */ var client = new Core({ accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'], accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], 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(result)); }, (ex) => { console.log(ex); })# -*- coding: utf-8 -*- from alibabacloud_tea_openapi.models import Config from alibabacloud_sts20150401.client import Client from alibabacloud_sts20150401.models import AssumeRoleRequest def main(): # 一時キーと一時トークンを入力します。 #Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。これらの資格情報を使用して Function Compute で操作を実行することは、リスクの高い操作です。API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを使用することをお勧めします。 # AccessKey ID と AccessKey シークレットをプロジェクトコードに保存しないことをお勧めします。保存した場合、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。 # この例では、ID 検証を実装するために、AccessKey ペアは環境変数に格納されています。 # サンプルコードを実行する前に、ローカル環境で ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を設定します。 # Function Compute のランタイムでは、実行権限を設定した後に、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が自動的に設定されます。 AccessKeySecret=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')) AccessKeyId=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID') regionId ='cn-hangzhou' config = Config( access_key_id='<ACCESS-KEY-ID>', access_key_secret='<ACCESS-KEY-SECRET>', region_id='cn-hangzhou' ) client = Client(config) assume_role_request = AssumeRoleRequest( duration_seconds=3600, role_arn='<RoleARN>', role_session_name='fc-python-sdk' ) response = client.assume_role(assume_role_request) response_json = json.loads(str(response.body).replace("'", "\"")) result = json.dumps(response_json) print(result) if __name__ == "__main__": main()次のサンプルコードは、期待される出力を示しています。
{ "RequestId": "964E0EC5-575B-4FF5-8FD0-D4BD8025602A", "AssumedRoleUser": { "Arn": "acs:ram::****:role/wss/wss", "AssumedRoleId": "***********:wss" }, "Credentials": { "SecurityToken": "*************", "AccessKeyId": "STS.*************", "AccessKeySecret": "*************", "Expiration": "2023-05-28T11:23:19Z" } }説明STS トークンを取得する際のよくある質問への回答については、「RAM ロールと STS トークンに関する FAQ」をご参照ください。アカウント B 内の RAM ユーザーがアカウント A 内の Function Compute のすべてのサービスを表示できるように、アカウント B の機能コードを変更します。
サンプルコード:
const FC = require('@alicloud/fc2'); // クライアントを構築します。 // 取得した一時キーを使用します。/* Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。これらの認証情報を使用して Function Compute で操作を実行することは、リスクの高い操作です。RAM ユーザーを使用して API 操作を呼び出したり、日常の O&M を実行することをお勧めします。 AccessKey ID と AccessKey シークレットをプロジェクトコードに保存しないことをお勧めします。保存すると、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。 この例では、ID 検証を実装するために、AccessKey ペアは環境変数に格納されています。 サンプルコードを実行する前に、ローカル環境で ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET、および ALIBABA_CLOUD_SECURITY_TOKEN 環境変数を設定します。 ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET、および ALIBABA_CLOUD_SECURITY_TOKEN 環境変数は、Function Compute のランタイムで実行権限を設定した後に自動的に設定されます。 */ const client = new FC('<accountID>', { region: '<yourRegionID>', accessKeyID: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'], securityToken: process.env['ALIBABA_CLOUD_SECURITY_TOKEN'], accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], }); // サービスをクエリします。 client.listServices().then(res => { console.log(JSON.stringify(res, null, ' ')) }).catch(ex=> console.log(ex))重要アカウント A によって作成され、一時キーの権限を付与するロールに、サービスをクエリする権限があることを確認してください。