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. 如果您想通过将新的或现有的服务ID与服务凭证关联来管理访问权限,请指定 None,以便为新凭证分配任何角色。
  5. (可选)单击高级选项

    1. 选择现有服务ID或创建新服务ID,以便与证书关联。 这样,您就可以直接在IAM中管理访问权限,方法是依次点击管理 > 访问(IAM)> 服务ID。 有关更多信息,请参阅创建和使用服务标识

      对于具有更精细粒度资源访问权限的服务,您可能希望使用服务 ID 仅授予对子资源的访问权限,例如 Object Storage 存储桶。

    2. 您可以以有效 JSON 对象的形式提供更多参数,该对象包含特定于服务的配置参数,可以内联提供,也可以在文件中提供。

      大多数服务不需要额外参数;对于需要额外参数的服务,每个服务都会定义自己的唯一参数列表。 有关支持的配置参数列表,请参阅特定服务的文档。

  6. 单击添加以生成新的服务凭证。

  7. 展开您的新服务凭证的详细信息。 复制您的应用程序或外部消费者所需的凭据属性。 例如,API密钥或密码和 URL。

使用应用程序接口创建服务证书

IBM Cloud 服务可以生成资源密钥,也称为凭证。 凭证是特定于服务的,其内容取决于每个服务对自己需要生成的凭证的定义。 凭证可能包含用户名、密码、主机名、端口和 URL,但每个凭证的内容对于生成它的服务来说是唯一的。

某些服务可能会生成需要传入参数的额外数据。 例如,服务可能会要求您输入语言参数来设置生成的资源密钥中返回的缺省语言。

您可以为 IBM Cloud 服务生成的新凭据分配IAM服务访问角色。 此角色允许访问整个服务实例,而非特定资源。 对于具有更精细粒度资源访问权限的服务,您可能希望仅授予子资源访问权限,例如 Object Storage 存储桶。 在这种情况下,请不要为新证书分配任何角色。 这样,您就可以通过将凭证与服务ID关联来管理细粒度访问,并创建一个IAM策略,将其应用于特定资源,例如存储桶。 为此,请前往管理 > 访问(IAM)> 服务ID。 选择与服务凭证密钥同名的服务ID,然后点击 “分配访问权限”。

要创建资源密钥,请调用 资源控制器 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 提供程序插件。 有关更多信息,请参阅 Terraform on IBM Cloud®入门 教程。 该插件对用于完成此任务的 IBM Cloud API 进行抽象。
  • 创建名为 main.tf 的 Terraform 配置文件。 在此文件中,您使用 HashiCorp 配置语言来定义资源。 有关更多信息,请参阅 Terraform 文档

请按照以下步骤创建一个凭证,用于将您的应用程序或外部消费者连接到 IBM Cloud 服务:

  1. main.tf 文件中创建自变量。 以下示例通过使用 ibm_resource_instance 资源为没有服务标识的资源创建凭证,其中 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 资源管理”页面上的参数参考详细信息。

  2. 完成构建配置文件后,初始化 Terraform CLI。 有关更多信息,请参阅 初始化工作目录

    terraform init
    
  3. main.tf 文件供应资源。 有关更多信息,请参阅 使用 Terraform 供应基础架构

    1. 运行 terraform plan 以生成 Terraform 执行计划来预览建议的操作。

      terraform plan
      
    2. 运行 terraform apply 以创建计划中定义的资源。

      terraform apply
      

使用 API 密钥或其他凭证属性将服务实例连接到您的应用程序或其他外部使用者。

查看凭证

onetime_credentials 配置为 false 的服务创建凭证后,需要凭证值的用户可随时查看。 不过,所有用户都必须有正确的访问级别,才能查看包含 API 密钥值的凭证详情。

要查看某个服务的现有服务凭证,请完成以下步骤:

  1. 从“资源列表”页面选择服务名称,打开服务详细信息页面。
  2. 单击服务凭证
  3. 在现有凭证所在的行上展开查看凭证

一次性证书

凭据有一个 onetime_credentials 属性,用于决定是否可以在初始创建后检索和查看凭据。 如果属性为 false,则有权限的用户可以随时查看凭据值。

在此属性更改之前创建的现有凭证不受影响。

凭证级别访问权

用户的访问权限必须等于或大于服务证书的访问权限。 例如,如果凭证的 IAM 服务角色为Writer,那么尝试查看凭证的用户针对分配的该特定服务的 IAM 服务角色必须为WriterManager。 如果用户没有正确的访问权限,API 密钥值等详细信息就会被编辑:

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

IAM 级别访问权

当无法通过比较用户和凭证的访问权来确定凭证级别访问权时,将编辑凭证:

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

要查看凭证,用户必须具有 IAM 级别的访问操作 resource-controller.credential.retrieve_all。 此操作以“管理员”角色提供,并覆盖使用户能够查看凭证的任何凭证级别访问权。

使用 API 查看凭证

onetime_credentials 配置为 false 的服务创建凭证后,需要凭证值的用户可随时查看。 不过,所有用户都必须有正确的访问级别,才能查看包含 API 密钥值的凭证详情。 用户的访问权必须大于或等于该服务凭证的访问权。 例如,如果凭据具有 IAM 服务角色 Writer,那么试图查看凭据的用户就必须具有为该特定服务分配的 IAM 服务角色 WriterManager

要获取所有资源键的列表,请调用 资源控制器 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 服务角色 WriterManager。 如果用户没有正确的访问权限,API 密钥值等详细信息就会被编辑:

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

IAM 级别访问权

当无法通过比较用户和凭证的访问权来确定凭证级别访问权时,将编辑凭证:

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

要查看凭证,用户必须具有 IAM 级别的访问操作 resource-controller.credential.retrieve_all。 此操作以“管理员”角色提供,并覆盖使用户能够查看凭证的任何凭证级别访问权。