以前は、ECS インスタンスにデプロイされたアプリケーションは通常、他の Alibaba Cloud プロダクトの API にアクセスするために、AccessKey ID と AK (AccessKey Secret) を使用する必要がありました。 AK は Alibaba Cloud API にアクセスするためのキーであり、対応するアカウントのすべての権限を持っています。 アプリケーションが AK を管理できるようにするには、AK をアプリケーション設定ファイルに保存するか、他の方法を使用して ECS インスタンスに保存する必要があり、これにより、AK の管理がより複雑になり、機密性が低下します。 さらに、複数のリージョンにわたって同時デプロイが必要な場合は、AK が、イメージまたはイメージによって作成されたインスタンスと共に拡散されるため、AK を変更するときにインスタンスとイメージを1つずつ更新および再度デプロイする必要があります。

インスタンス RAM ロールを利用して、ECS インスタンスに RAM ロールを割り当てます。 インスタンス上のアプリケーションは、STS 資格情報を使用して他のクラウドプロダクトの API にアクセスできます。 STS 資格情報はシステムによって自動的に生成および更新され、アプリケーションは指定されたメタデータ URL を使用し、特別な管理なしに STS 資格情報を取得します。 その間、RAM ロールと権限付与ポリシーを変更して、インスタンスに対する異なるまたは同一の権限を、異なる Alibaba Cloud プロダクトに付与します。

ここでは、RAM ロールを果たす ECS インスタンスを作成する方法と、ECS インスタンス上のアプリケーションを、 STS 資格情報を使用して他の Alibaba Cloud プロダクトにアクセスする方法を紹介します。

ここでの例を簡単に始めるために、文書内のすべての操作は OpenAPI Explorer で行います。OpenAPI Explorer は、記録されたユーザー情報を介して現在のアカウントの一時的な AK を取得し、現在のアカウントに対してオンラインリソース操作を開始します。 操作は慎重に行ってください。 インスタンスを作成すると料金が発生します。 操作が完了したらすぐにインスタンスをリリースしてください。

手順

インスタンス RAM ロールを使用して、インスタンス上の Python が同じアカウントで OSS バケットにアクセスできるようにするには、次の手順を実行します。

手順 1. RAM ロール を作成して権限付与ポリシーにアタッチします。

手順 2 . 作成する RAM のロールを果たす ECS インスタンスを作成します。

手順 3 . インスタンス内で、メタデータ URL にアクセスして STS 資格情報を取得します。

手順 4 . STS 資格情報を使用し、Python を使用して OSS にアクセスし ます。

手順 1. RAM ロール の作成および権限付与ポリシーへのアタッチ

CreateRole API を使用して

  1. RAM ロールを作成します。 必要なリクエストのパラメーターは以下のとおりです。
    • RoleName: ロールの名前を指定します。 この例では EcsRamRoleTest が使用されています。
    • AssumeRolePolicyDocument: 次のようにポリシーを指定します。これは、作成されるロールがサービスロールであり、Alibaba Cloud プロダクト (この例では ECS) がこのロールを果たすように割り当てられていることを示します。

      {
      "Statement": [
      {
      "Action":"sts:AssumeRole",
      "Effect":"Allow",
      "Principal": {
      "Service":[
        "ecs.aliyuncs.com"
      ]
      }
      }
      ],
      "Version":"1"
      }
      
  2. CreatePolicy APIを使用して、権限付与ポリシーを作成します。 必要なリクエストのパラメーターは以下のとおりです。
    • PolicyName: 権限付与ポリシーの名前を指定します。 この例では EcsRamRolePolicyTest が使用されています。
    • PolicyDocument: 次のようにポリシーを指定します。これは、ロールが OSS 読み取り専用権限を持っていることを示します。

      {
      "Statement": [
      {
      "Action": [
      "oss:Get*",
      "oss:List*"
      ],
      "Effect":"Allow",
      "Resource":"*"
      }
      ],
      "Version":"1"
      }
      
  3. AttachPolicyToRole API を使用して、権限付与ポリシーをロールにアタッチします。 必要なリクエストのパラメーターは以下のとおりです。
    • PolicyType: カスタムに設定します。
    • PolicyName: 手順 2 で指定したポリシー名を 使用します。 この例では EcsRamRolePolicyTes を使用します。
    • RoleName: 手順 1 で指定したロール名を使用します。 この例では EcsRamRoleTest を使用します。

手順 2. RAM ロールを再生する ECS インスタンスを作成する

どちらの方法でも、RAM ロールを再生する ECS インスタンスを作成できます。

  • 既存の VPC 接続 ECS インスタンスにRAM ロールをアタッチする
  • RAM ロールを持つ VPC 接続 ECS インスタンスの作成
既存の VPC 接続 ECS インスタンスにRAM ロールをアタッチする

AttachInstanceRamRole API を使用して、既存の VPC 接続 ECS インスタンスに RAM ロールをアタッチします。 パラメーターは以下のとおりです。

  • RegionId: インスタンスが置かれているリージョンの ID。
  • RamRoleName: RAM ロールの名前。 この例では、EcsRamRoleTest が使用されています。 この例では、 EcsRamRoleTest です。
  • InstanceIds: RAM ロールをアタッチする VPC 接続 ECS インスタンスの ID。1 つのインスタンスの場合は ["i-bXXXXXXX"]、複数のインスタンスの場合は ["i-bXXXXX"、"i-cXXXXX"、["i-bXXXXXXXX"] の形式になります。
RAM ロールを持つ VPC 接続 ECS インスタンスの作成の作成

RAM ロールを持つ ECS インスタンスを作成する前に、VPC ネットワークが必要です。

  1. RAM ロールを持つ VPC 接続 ECS インスタンスを作成するには、次の手順に従います。CreateInstance API を使用して ECS インスタンスを作成します。 必要なリクエストのパラメーターは以下のとおりです。
    • RegionId: インスタンスのリージョン。 この例では、cn-hangzhou が使用されています。 この例では、cn-hangzhou が使用されています。
    • ImageId: インスタンスのイメージ。 この例では、centos_7_03_64_40G_alibase_20170503.vhd が使用されています。 この例では、centos_7_03_64_40G_alibase_20170503.vhd が使用されています。
    • InstanceType: インスタンスのタイプ。 この例では、ecs.xn4.small が使用されています。
    • VSwitchId: インスタンスが置かれている VPC ネットワークの仮想スイッチ。 インスタンス RAM のロールは VPC ネットワークのみをサポートするため、VSwitchId が必要です。
    • RamRoleName: RAM ロールの名前。 この例では、EcsRamRoleTest が使用されています。

    ECS インスタンスを作成する権限に加えて、サブアカウントを承認して指定された RAM のロールを果たす ECS インスタンスを作成する場合は、サブアカウントに PassRole 権限が必要です。 したがって、権限付与ポリシーを次のようにカスタマイズしてサブアカウントにアタッチする必要があります。 アクションが ECS インスタンスのみを作成している場合は、[ECS RAM アクション] を"ecs:CreateInstance"に設定します。 サブアカウントに対するすべての ECS アクション権限を付与する場合は、[ECS RAM Action] を"ecs:*" に設定します。

    {
      "Statement": [
        {
          "ecs: [ECS RAM Action]", 
          "Resource":"*",
          "Effect":"Allow"
        },
    	{
          "Action":"ram:PassRole",
          "Resource":"*",
          "Effect":"Allow"
      ],
      "Version":"1"
    }
    
  2. パスワードを設定してインスタンスを起動します。
  3. ECS インスタンスを設定して、API を使用するか ECS コンソールでインターネットにアクセスします。

手順 3: インスタンス内のメタデータ URL にアクセスして STS 資格情報を取得

インスタンスの STS 資格情報を取得するには、次の手順を実行します。

現在の STS 資格情報が期限切れになる 30 分前に、新しい ものが生成されます。 この期間中は、両方の STS 資格情報を使用できます。
  1. インスタンスに接続します。
  2. http://100.100.100.200/latest/meta-data/ram/security-credentials/EcsRamRoleTest にアクセスして STS 資格情報を取得します。URLの最後の部分は RAM ロール名です。作成する名前と置き換える必要があります。 パスの最後の部分は RAM ロール名です。作成する名前と置き換える必要があります。
    この例では、curly コマンドを使用して、上記の curl にアクセスします。この例では、URL にアクセスするために curl コマンドを実行します。 Windows ECS インスタンスを使用している場合は、ECS ユーザーガイドの「インスタンスのメタデータの使用」を参照して、STS 資格情報を取得してください。

    リターンパラメーターは以下のとおりです。

    [root@local ~]# curl http://100.100.100.200/latest/meta-data/ram/security-credentials/EcsRamRoleTest
    {
    "AccessKeyId":"XXXXXXXXX",
    "AccessKeySecret":"XXXXXXXXX",
    "Expiration":"2017-06-09T09:17:19Z",
    "SecurityToken":"CAIXXXXXXXXXXXwmBkleCTkyI+",
    "LastUpdated":"2017-10-31T23:20:01Z",
    "Code":"Success"
    }
    

手順 4: Python SDK を使用して STS 資格情報を使って OSS にアクセス

この例では、STS 資格情報を使用して、インスタンスと同じリージョンにある OSS バケット内の 10 個のファイルをリストアップするために Python を使用します。

前提条件

ECS インスタンスにリモート接続しています。

Python が ECS インスタンスにインストールされています。 Linux ECS インスタンスを使用している場合は、pip をインストールする必要があります。

インスタンスのリージョンにバケットが作成され、バケット名とエンドポイントが取得されています。 この例では、バケット名は ramroletest、エンドポイントは oss-cn-hangzhou.aliyuncs.com です。

手順

Python を使用して OSS バケットにアクセスするには、次の手順に従います。

  1. コマンド pip install oss2 を実行して、OSS Python SDK をインストールします。
  2. 次のコマンドを実行してテストします。
    • The three parameters in oss2. StsAuth は、上記の URL が返す AccessKeyId、AccessKeySecret、SecurityToken にそれぞれ対応します。
    • The last two parameters in oss2. Bucket は、bucketcodeph 名とエンドポイントです。
    	import oss2
    	from itertools import islice
    	auth = oss2. StsAuth(<AccessKeyId>, <AccessKeySecret>, <SecurityToken>)
    	bucket = oss2. bucket = oss2.Bucket(auth, <your Endpoint>, <your Bucket name>)
    	for b in islice(oss2. ObjectIterator(bucket), 10):
    	    print(b.key)
    

    出力結果は以下のとおりです。

    [root@local ~]# python
    Python 2.7.5 (default, Nov  6 2016, 00:28:07)
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
    Type"help","copyright","credits"or"license"for more information.
    >>> import oss2
    >>> from itertools import islice
    >>> auth = oss2. StsAuth("STS.J8XXXXXXXXXX4","9PjfXXXXXXXXXBf2XAW","CAIXXXXXXXXXXXwmBkleCTkyI+")
    >>> bucket = oss2. Bucket(auth,"oss-cn-hangzhou.aliyuncs.com","ramroletest")
    >>> for b in islice(oss2. ObjectIterator(bucket), 10):
    ...     print(b.key)
    ...
    ramroletest.txt
    test.sh