IBM Cloud Docs
サービスとアプリの連携

サービスとアプリの連携

新しいサービス認証情報を生成することで、 IBM Cloud サービスにアプリやサードパーティ製ツールを接続します。 これらの認証情報は、 IBM Cloud® または AWS のような外部プラットフォームでホストされているかどうかに関わらず、お客様のアプリと、お客様が利用したい IBM Cloud® サービスとの間の橋渡しとなります。 例えば、 AWS がホストするアプリを watsonx Assistant と統合する場合、必要なアクセス権限を提供するサービス認証情報を生成します。 次に、アプリの設定に追加して接続を確立します。

アプリにクレデンシャルを追加するには、使用しているアプリまたはコンピュート・オプションのタイプのドキュメントを参照してください。

サービス資格の作成

IBM Cloud Identity and Access Management (IAM) によって管理されるサービスは、リソース・キー (資格情報とも呼ばれる) を生成できます。 資格情報は、サービスに固有であり、各サービスが、生成する必要がある資格情報をどのように定義しているかによって異なります。 クレデンシャルには、ユーザー名、パスワード、ホスト名、ポート、 URL が含まれる場合がありますが、各クレデンシャルの内容は、それを生成するサービスに固有のものです。

サービスの中には、パラメーターを渡す必要がある追加データを生成するものもあります。 例えば、あるサービスでは、生成されるリソース・キーで返されるデフォルト言語を設定するための言語パラメーターの入力が要求される場合があります。

サービスに資格情報を追加するには、以下の手順に従います

  1. リソースリストからサービス名を選択し、サービスの詳細ページを開きます。

  2. サービス資格情報 > 新しい資格情報 + をクリックします。

  3. 名前を入力してください。

  4. IAMサービスアクセス権限を割り当てる。 役割の詳細については 、 IBM Cloud のIAMの役割 を参照してください。

    1. None を指定すると、新しいまたは既存のサービスIDをサービスクレデンシャルに関連付けることでアクセスを管理する場合に、新しいクレデンシャルに役割を割り当てないようにすることができます。
  5. (オプション) 詳細オプションをクリックします

    1. 既存のサービスIDを選択するか、 新しいサービスIDを作成して、クレデンシャルと関連付けます。 この方法では 、[管理] > [アクセス(IAM)] > [サービスID] に進むことで、IAM内で直接アクセスを管理することができます。 詳しくは、サービス ID の作成と処理を参照してください。

      より細かい粒度でリソースへのアクセスを制御するサービスでは、サービスIDを使用して、 Object Storage バケットなどのサブリソースのみにアクセスを許可することができます。

    2. サービス固有のコンフィギュレーション・パラメータを含む有効なJSONオブジェクトとして、インラインまたはファイルで提供される、より多くのパラメータを提供することができます。

      多くのサービスでは追加のパラメーターは必要なく、追加パラメーターを必要とするサービスでは、各サービスが独自の固有パラメーター・リストを定義しています。 サポートされている設定パラメータのリストについては、特定のサービスのドキュメントを参照してください。

  6. **「追加」**をクリックして、新しいサービス資格情報を生成します。

  7. 新しいサービス資格の詳細を拡大する。 アプリケーションまたは外部の消費者が必要とする認証プロパティをコピーします。 例えば、APIキーまたはパスワードと URL。

APIを使用したサービス・クレデンシャルの作成

IBM Cloud サービスは、クレデンシャルとしても知られるリソース・キーを生成できる。 資格情報は、サービスに固有であり、各サービスが、生成する必要がある資格情報をどのように定義しているかによって異なります。 クレデンシャルには、ユーザー名、パスワード、ホスト名、ポート、 URL が含まれる場合がありますが、各クレデンシャルの内容は、それを生成するサービスに固有のものです。

サービスの中には、パラメーターを渡す必要がある追加データを生成するものもあります。 例えば、あるサービスでは、生成されるリソース・キーで返されるデフォルト言語を設定するための言語パラメーターの入力が要求される場合があります。

IBM Cloud サービス用に生成する新しい認証情報に、IAMサービスアクセス権限を割り当てることができます。 このロールは、特定のリソースではなく、サービスインスタンス全体へのアクセスを許可します。 より細かい粒度のリソースアクセスが必要なサービスについては、 Object Storage バケットなどのサブリソースのみにアクセスを許可したい場合があるかもしれません。 この場合、新しいクレデンシャルには役割を割り当てない。 このように、クレデンシャルをサービスIDに関連付けることで、きめ細かいアクセス管理が可能になり、バケットなどの特定のリソースにスコープを限定したIAMポリシーを作成することができます。 これを行うには 、「管理」>「アクセス(IAM)」>「サービスID」 に移動します。 サービス認証キーと同じ名前のサービスIDを選択し 、「アクセス権の割り当て」 をクリックします。

リソース・キーを作成するには、以下の例のように Resource Controller API を呼び出します。

curl -X POST https://resource-controller.cloud.ibm.com/v2/resource_keys -H 'Authorization: Bearer <IAM_TOKEN>' -H 'Content-Type: application/json' -d '{
  "name": "my-instance-key-1",
  "source": "267bf377-7fa2-43f6-94ec-09103a8e89d4",
  "role": "Writer"
}'
ResourceKeyPostParameters parameters = new ResourceKeyPostParameters.Builder()
  .add("exampleParameter", "exampleValue")
  .build();
CreateResourceKeyOptions createResourceKeyOptions = new CreateResourceKeyOptions.Builder()
  .name(keyName)
  .source(instanceGuid)
  .parameters(parameters)
  .build();

Response<ResourceKey> response = service.createResourceKey(createResourceKeyOptions).execute();
ResourceKey resourceKey = response.getResult();

System.out.printf("createResourceKey() response:\n%s\n", resourceKey.toString());
const parameters = {
  'exampleParameter': 'exampleValue'
};

const params = {
  name: keyName,
  source: instanceGuid,
  parameters: parameters,
};

resourceControllerService.createResourceKey(params)
  .then(res => {
    instanceKeyGuid = res.result.guid;
    console.log('createResourceKey() response:\n' + JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
parameters = {
    'exampleParameter': 'exampleValue'
}
resource_key = resource_controller_service.create_resource_key(
    name=key_name,
    source=instance_guid,
    parameters=parameters
).get_result()

print('\ncreate_resource_key() response:\n',
      json.dumps(resource_key, indent=2))
createResourceKeyOptions := resourceControllerService.NewCreateResourceKeyOptions(
  keyName,
  instanceGUID,
)

parameters := &resourcecontrollerv2.ResourceKeyPostParameters{}
parameters.SetProperty("exampleParameter", "exampleValue")
createResourceKeyOptions.SetParameters(parameters)

resourceKey, response, err := resourceControllerService.CreateResourceKey(createResourceKeyOptions)
if err != nil {
  panic(err)
}
b, _ := json.MarshalIndent(resourceKey, "", "  ")
fmt.Printf("\nCreateResourceKey() response:\n%s\n", string(b))

APIキーまたはその他の認証プロパティを使用して、サービスインスタンスをアプリやその他の外部消費者と接続します。

Terraform を使用してサービス資格情報を作成する

Terraformを使用して、アプリまたは外部消費者と IBM Cloud サービスを接続するための認証情報を作成する前に、以下の作業が完了していることを確認してください

  • Terraform CLI をインストールし、Terraform 用の IBM Cloud プロバイダー・プラグインを構成します。 詳しくは、 IBM Cloud® のチュートリアルを参照してください。 このプラグインは、以下のタスクを実行するために使用される IBM Cloud API を抽象化します。
  • main.tfという名前の Terraform 構成ファイルを作成します。 このファイルでは、 HashiCorp 構成言語を使用してリソースを定義します。 詳しくは Terraformのドキュメントを参照。

IBM Cloud サービスにアプリまたは外部消費者(consumer)を接続するための認証情報を作成するには、以下の手順に従います

  1. main.tf ファイルに引数を作成します。 ibm_resource_instance リソースを使用して、サービス ID を指定せずにリソースの資格情報を作成する例を以下に示します。name は、資格情報を識別するための固有の名前です。

    data "ibm_resource_instance" "resource_instance" {
     name = "myobjectsotrage"
    }
    
    resource "ibm_resource_key" "resourceKey" {
     name                 = "myobjectkey"
     role                 = "Viewer"
     resource_instance_id = data.ibm_resource_instance.resource_instance.id
    
     //User can increase timeouts
     timeouts {
       create = "15m"
      delete = "15m"
     }
    }
    

    デフォルトでは、ibm_resource_key リソースは、サービスのパブリック・サービス・エンドポイントを使用するサービス資格情報を作成します。

    リソース・グループ・インスタンスに関連付ける tags を指定できます。 詳細は Terraform Resource Management ページの引数リファレンス詳細を参照。

  2. 構成ファイルの作成が完了したら、Terraform CLI を初期化します。 詳しくは、 作業ディレクトリーの初期化を参照してください。

    terraform init
    
  3. main.tf ファイルからリソースをプロビジョンします。 詳しくは、 Terraform を使用したインフラストラクチャーのプロビジョニングを参照してください。

    1. terraform plan を実行して、提案されたアクションをプレビューするための Terraform 実行プランを生成します。

      terraform plan
      
    2. terraform apply を実行して、計画に定義されているリソースを作成します。

      terraform apply
      

APIキーまたはその他の認証プロパティを使用して、サービスインスタンスをアプリやその他の外部消費者と接続します。

資格情報の表示

onetime_credentialsfalse に設定されたサービスに対してクレデンシャルが作成された後、クレデンシャルの値を必要とするユーザーはいつでもそれを見ることができます。 ただし、API キー値を含む資格情報の詳細を表示するには、すべてのユーザーが適切なレベルのアクセス権限を持っている必要があります。

サービスに対する既存のサービス資格情報を表示するには、以下のステップを実行します。

  1. 「リソース・リスト」ページで、サービス詳細ページを開くサービスの名前を選択します。
  2. **「サービス資格情報」**をクリックします。
  3. 既存の資格情報の行で、**「資格情報の表示」**を展開します。

1回限りの資格証明書

クレデンシャルには onetime_credentials プロパティがあり、最初の作成後にクレデンシャルを取得して表示できるかどうかを決定します。 プロパティが false の場合、アクセス権を持つユーザーはいつでもクレデンシャルの値を表示できます。

このプロパティの変更前に作成された既存のクレデンシャルは影響を受けない。

資格情報レベルのアクセス権限

ユーザーのアクセス権限は、サービス資格情報のアクセス権限以上でなければなりません。 例えば、資格情報が IAM サービス役割のWriterを持っている場合、資格情報の表示を試行するユーザーは、割り当てられたその特定のサービスに対して IAM サービス役割のWriterまたはManagerを持っている必要があります。 ユーザーが適切なアクセス権限を持っていない場合は、API キー値などの詳細は編集されます。

    "credentials": {
        "REDACTED": "REDACTED"
    },

IAM レベルのアクセス権限

ユーザーのアクセス権限と資格情報のアクセス権限を比較して資格情報レベルのアクセス権限を判別できない場合、資格情報は編集されます。

    "credentials": {
        "REDACTED": "REDACTED_EXPLICIT"
    },

資格情報を表示するには、ユーザーに IAM レベルのアクセス・アクション resource-controller.credential.retrieve_all が必要です。 このアクションは管理者役割で実行され、資格情報レベルのアクセス権限をオーバーライドします。これにより、ユーザーが資格情報を表示できるようになります。

API を使用した資格情報の表示

onetime_credentialsfalse に設定されたサービスに対してクレデンシャルが作成された後、クレデンシャルの値を必要とするユーザーはいつでもそれを見ることができます。 ただし、API キー値を含む資格情報の詳細を表示するには、すべてのユーザーが適切なレベルのアクセス権限を持っている必要があります。 ユーザーのアクセス権限は、サービス資格情報のアクセス権限以上でなければなりません。 たとえば、クレデンシャルに IAM サービス・ロール Writer がある場合、クレデンシャルを表示しようとするユーザは、その特定のサービスの IAM サービス・ロール Writer または Manager を割り当てられていなければならない。

すべてのリソース・キーのリストを取得するには、以下の例のように Resource Controller API を呼び出します。

curl -X GET https://resource-controller.cloud.ibm.com/v2/resource_keys -H 'Authorization: Bearer <IAM_TOKEN>'
ListResourceKeysOptions listResourceKeysOptions = new ListResourceKeysOptions.Builder()
  .name(keyName)
  .build();

Response<ResourceKeysList> response = service.listResourceKeys(listResourceKeysOptions).execute();
ResourceKeysList resourceKeysList = response.getResult();

System.out.printf("listResourceKeys() response:\n%s\n", resourceKeysList.toString());
const params = {
  name: keyName,
};

resourceControllerService.listResourceKeys(params)
  .then(res => {
    console.log('listResourceKeys() response:\n' + JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
resource_keys_list = resource_controller_service.list_resource_keys(
    name=key_name
).get_result()

print('\nlist_resource_keys() response:\n',
      json.dumps(resource_keys_list, indent=2))
listResourceKeysOptions := resourceControllerService.NewListResourceKeysOptions()
listResourceKeysOptions = listResourceKeysOptions.SetName(keyName)

resourceKeysList, response, err := resourceControllerService.ListResourceKeys(listResourceKeysOptions)
if err != nil {
  panic(err)
}
b, _ := json.MarshalIndent(resourceKeysList, "", "  ")
fmt.Printf("\nListResourceKeys() response:\n%s\n", string(b))

応答の例:

{
  "rows_count": 1,
  "next_url": null,
  "resources": [
    {
      "id": "crn:v1:bluemix:public:cloud-object-storage:global:a/4329073d16d2f3663f74bfa955259139:8d7af921-b136-4078-9666-081bd8470d94:resource-key:23693f48-aaa2-4079-b0c7-334846eff8d0",
      "guid": "23693f48-aaa2-4079-b0c7-334846eff8d0",
      "url": "/v2/resource_keys/23693f48-aaa2-4079-b0c7-334846eff8d0",
      "created_at": "2018-07-02T22:03:43.837979455Z",
      "updated_at": "2018-07-02T22:03:43.837979455Z",
      "deleted_at": null,
      "created_by": "IBMid-5500093BHN",
      "updated_by": "IBMid-5500093BHN",
      "deleted_by": "",
      "source_crn": "crn:v1:bluemix:public:cloud-object-storage:global:a/4329073d16d2f3663f74bfa955259139:8d7af921-b136-4078-9666-081bd8470d94::",
      "role": "crn:v1:bluemix:public:iam::::serviceRole:Writer",
      "name": "my-instance-key-1",
      "parameters": {
        "role_crn": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
      },
      "crn": "crn:v1:bluemix:public:cloud-object-storage:global:a/4329073d16d2f3663f74bfa955259139:8d7af921-b136-4078-9666-081bd8470d94:resource-key:23693f48-aaa2-4079-b0c7-334846eff8d0",
      "state": "active",
      "account_id": "4329073d16d2f3663f74bfa955259139",
      "resource_group_id": "0be5ad401ae913d8ff665d92680664ed",
      "resource_id": "dff97f5c-bc5e-4455-b470-411c3edbe49c",
      "onetime_credentials": false,
      "credentials": {
        "apikey": "XXXX-YYYY-ZZZZ\"",
        "endpoints": "https://cos-service-armada-s.us-south.containers.mybluemix.net/endpoints",
        "iam_apikey_description": "Auto generated apikey during resource-key operation for Instance - crn:v1:bluemix:public:cloud-object-storage:global:a/4329073d16d2f3663f74bfa955259139:8d7af921-b136-4078-9666-081bd8470d94::",
        "iam_apikey_name": "auto-generated-apikey-23693f48-aaa2-4079-b0c7-334846eff8d0",
        "iam_role_crn": "crn:v1:bluemix:public:iam::::serviceRole:Writer",
        "iam_serviceid_crn": "crn:v1:bluemix:public:iam-identity::a/4329073d16d2f3663f74bfa955259139::serviceid:ServiceId-64c29e4f-422d-468c-a11b-1a8f671b5c89",
        "resource_instance_id": "crn:v1:bluemix:public:cloud-object-storage:global:a/4329073d16d2f3663f74bfa955259139:8d7af921-b136-4078-9666-081bd8470d94::"
      },
      "iam_compatible": true,
      "migrated": false,
      "resource_instance_url": "/v2/resource_instances/8d7af921-b136-4078-9666-081bd8470d94",
      "resource_alias_url": null
    }
  ]
}

資格情報レベルのアクセス権限

ユーザーのアクセス権限は、サービス資格情報のアクセス権限以上でなければなりません。 例えば、資格情報に IAM サービス役割 Writer がある場合、資格情報を表示しようとするユーザーには、その特定のサービスに対する IAM サービス役割 Writer または Manager が割り当てられている必要があります。 ユーザーが適切なアクセス権限を持っていない場合は、API キー値などの詳細は編集されます。

    "credentials": {
        "REDACTED": "REDACTED"
    },

IAM レベルのアクセス権限

ユーザーのアクセス権限と資格情報のアクセス権限を比較して資格情報レベルのアクセス権限を判別できない場合、資格情報は編集されます。

    "credentials": {
        "REDACTED": "REDACTED_EXPLICIT"
    },

資格情報を表示するには、ユーザーに IAM レベルのアクセス・アクション resource-controller.credential.retrieve_all が必要です。 このアクションは管理者役割で実行され、資格情報レベルのアクセス権限をオーバーライドします。これにより、ユーザーが資格情報を表示できるようになります。