以前は、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 プロダクトにアクセスする方法を紹介します。
手順
インスタンス RAM ロールを使用して、インスタンス上の Python が同じアカウントで OSS バケットにアクセスできるようにするには、次の手順を実行します。
手順 1. RAM ロール を作成して権限付与ポリシーにアタッチします。
手順 2 . 作成する RAM のロールを果たす ECS インスタンスを作成します。
手順 3 . インスタンス内で、メタデータ URL にアクセスして STS 資格情報を取得します。
手順 4 . STS 資格情報を使用し、Python を使用して OSS にアクセスし ます。
手順 1. RAM ロール の作成および権限付与ポリシーへのアタッチ
CreateRole API を使用して
- RAM ロールを作成します。 必要なリクエストのパラメーターは以下のとおりです。
- RoleName: ロールの名前を指定します。 この例では EcsRamRoleTest が使用されています。
-
AssumeRolePolicyDocument: 次のようにポリシーを指定します。これは、作成されるロールがサービスロールであり、Alibaba Cloud プロダクト (この例では ECS) がこのロールを果たすように割り当てられていることを示します。
{ "Statement": [ { "Action":"sts:AssumeRole", "Effect":"Allow", "Principal": { "Service":[ "ecs.aliyuncs.com" ] } } ], "Version":"1" }
- CreatePolicy APIを使用して、権限付与ポリシーを作成します。 必要なリクエストのパラメーターは以下のとおりです。
- PolicyName: 権限付与ポリシーの名前を指定します。 この例では EcsRamRolePolicyTest が使用されています。
-
PolicyDocument: 次のようにポリシーを指定します。これは、ロールが OSS 読み取り専用権限を持っていることを示します。
{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect":"Allow", "Resource":"*" } ], "Version":"1" }
- AttachPolicyToRole API を使用して、権限付与ポリシーをロールにアタッチします。 必要なリクエストのパラメーターは以下のとおりです。
- PolicyType: カスタムに設定します。
- PolicyName: 手順 2 で指定したポリシー名を 使用します。 この例では EcsRamRolePolicyTes を使用します。
- RoleName: 手順 1 で指定したロール名を使用します。 この例では EcsRamRoleTest を使用します。
手順 2. RAM ロールを再生する ECS インスタンスを作成する
どちらの方法でも、RAM ロールを再生する ECS インスタンスを作成できます。
- 既存の VPC 接続 ECS インスタンスにRAM ロールをアタッチする
- RAM ロールを持つ VPC 接続 ECS インスタンスの作成
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 ロールを持つ ECS インスタンスを作成する前に、VPC ネットワークが必要です。
- 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" }
- パスワードを設定してインスタンスを起動します。
- ECS インスタンスを設定して、API を使用するか ECS コンソールでインターネットにアクセスします。
手順 3: インスタンス内のメタデータ URL にアクセスして STS 資格情報を取得
インスタンスの STS 資格情報を取得するには、次の手順を実行します。
- インスタンスに接続します。
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 バケットにアクセスするには、次の手順に従います。
- コマンド
pip install oss2
を実行して、OSS Python SDK をインストールします。 - 次のコマンドを実行してテストします。
-
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
-