将 Google Cloud 数据集成到成本管理中

Cost Management Service 1-latest

了解如何添加和配置 Google Cloud 集成

Red Hat Customer Content Services

摘要

了解如何将 Google Cloud 集成添加到成本管理。成本管理是 Red Hat Insights 服务产品组合的一部分。高级分析工具的 Red Hat Insights 套件可帮助您识别和优先影响您的操作、安全性和业务。

第 1 章 创建 Google Cloud 集成

要将 Google Cloud 帐户添加到成本管理中,您必须配置 Google Cloud 以提供指标,然后将 Google Cloud 帐户添加为 Red Hat Hybrid Cloud Console 用户界面的集成。

注意

在向成本管理添加集成前,您必须拥有具有 Cloud Administrator 权利的用户。

在将 Google Cloud 帐户作为数据集成添加到成本管理前,您必须在 Google Cloud 帐户上配置以下服务,以允许对指标进行成本管理:

  • 成本管理 Google Cloud 项目.
  • 具有正确角色的账单服务帐户成员,将您的 数据导出到红帽混合云控制台
  • bigquery 数据集,包含成本数据。
  • 将成本数据发送到 BigQuery 数据集的账单导出。

在 Google Cloud 控制台中完成一些以下步骤,并在成本管理用户界面中完成一些步骤,使这两个应用程序在网页浏览器中打开。

Integrations 页面将 Google Cloud 集成添加到成本管理。

注意

由于第三方产品和文档可能会改变,因此配置第三方集成的说明一般是常规的,并在发布时进行更正。有关最新信息,请参阅 Google Cloud Platform 文档

1.1. 将 Google Cloud 帐户添加为集成

您可以将 Google Cloud 帐户添加为集成。添加 Google Cloud 集成后,成本管理应用程序会处理 Google Cloud 帐户中的成本和使用数据,并使其可以被查看。

先决条件

  • 要向成本管理添加数据集成,您必须拥有具有 Cloud Administrator 权限的红帽帐户。

流程

  1. Red Hat Hybrid Cloud Console 中,点 Settings Menu Settings icon > Integrations
  2. Settings 页面中,在 Cloud 选项卡中点 Add integration
  3. Add a cloud integration 向导中,选择 Google Cloud 作为云供应商类型,然后点 Next
  4. 输入您的集成名称。点击 Next
  5. Select application 步骤中,选择 Cost management 并点 Next

1.2. 创建 Google Cloud 项目

创建 Google Cloud 项目,以收集并发送您的成本报告到成本管理。

先决条件

  • 使用 resourcemanager.projects.create 权限访问 Google Cloud Console

流程

  1. Google Cloud Console 中,点 IAM & AdminCreate a Project
  2. 在出现的新页面中输入项目名称并选择您的账单帐户。
  3. 选择 Organization
  4. Location 框中输入父机构。
  5. Create

验证步骤

  1. 进入到 Google Cloud Console Dashboard
  2. 验证项目位于菜单栏中。

其他资源

1.3. 创建 Google Cloud Identity and Access Management 角色

用于成本管理的自定义 Identity and Access Management (IAM)角色可以访问启用 Google Cloud Platform 集成并禁止访问其他资源所需的特定成本相关资源。

先决条件

  • 使用这些权限访问 Google Cloud 控制台:

    • resourcemanager.projects.get
    • resourcemanager.projects.getIamPolicy
    • resourcemanager.projects.setIamPolicy
  • Google Cloud 项目

流程

  1. Google Cloud Console 中,点 IAM & AdminRoles
  2. 从菜单栏中的下拉菜单中选择成本管理项目。
  3. 单击 + Create role
  4. 为角色输入 TitleDescriptionID。在本例中,使用 customer-data-role
  5. 单击 + ADD PERMISSIONS
  6. 使用 Enter property name 或 value 字段搜索,并为自定义角色选择这四个权限:

    • bigquery.jobs.create
    • bigquery.tables.getData
    • bigquery.tables.get
    • bigquery.tables.list
  7. 单击 ADD
  8. CREATE

其他资源

1.4. 将账单服务帐户成员添加到您的 Google Cloud 项目中

您必须创建一个账单服务帐户成员,该成员可将成本报告导出到项目中的 红帽混合云控制台

先决条件

  • 使用这些权限访问 Google Cloud 控制台:

    • resourcemanager.projects.get
    • resourcemanager.projects.getIamPolicy
    • resourcemanager.projects.setIamPolicy
  • Google Cloud 项目
  • 成本管理身份和访问管理(IAM) 角色

流程

  1. Google Cloud Console 中,点 IAM & AdminIAM
  2. 从菜单栏中的下拉菜单中选择成本管理项目。
  3. 单击 ADD
  4. 将您创建的 IAM 角色粘贴到 New principals 字段中:

    billing-export@red-hat-cost-management.iam.gserviceaccount.com
  5. Assign roles 部分中,分配您创建的 IAM 角色。在本例中,使用 customer-data-role
  6. SAVE

验证步骤

  1. 导航到 IAM & AdminIAM
  2. 验证新成员是否存在正确的角色。

其他资源

1.5. 创建 Google Cloud BigQuery 数据集

创建一个 BigQuery 数据集来收集和存储计费数据以进行成本管理。

先决条件

  • 使用 bigquery.datasets.create 权限访问 Google Cloud Console
  • Google Cloud 项目

流程

  1. Google Cloud Console 中,单击 Big DataBigQuery
  2. Explorer 面板中选择成本管理项目。
  3. 单击 CREATE DATASET
  4. Dataset ID 字段中输入 dataset 的名称。在本例中,使用 CustomerData
  5. 单击 CREATE DATASET

1.6. 将 Google Cloud billing 数据导出到 BigQuery

为 BigQuery 启用计费导出,将您的 Google Cloud 计费数据(如使用、成本估算和定价数据)自动发送到成本管理 BigQuery 数据集。

先决条件

流程

  1. Google Cloud Console 中,单击 BillingBilling export
  2. 单击 Billing export 选项卡。
  3. 在详细信息 使用成本 部分中点 EDIT SETTINGS
  4. 在下拉菜单中选择 成本管理项目 和计费导出 数据集。
  5. SAVE

验证步骤

  1. 在详细信息 使用成本 部分中,验证标有 Enabled 的复选标记,其具有正确的 项目名称和 数据集名称

1.6.1. 查看 BigQuery 中的账单表

您可能需要查看收集并发送到成本管理的指标。这也有助于以成本管理进行故障排除或缺少数据。

注意

Google 可能需要几小时时间将计费数据导出到 BigQuery 数据集。

先决条件

  • 使用 bigquery.dataViewer 角色访问 Google Cloud 控制台

流程

  1. 进入 Google Cloud Console 中的 Big DataBigQuery
  2. Explorer 面板中选择成本管理项目。
  3. 在成本管理 dataset 下点 gcp_billing_export_v1_xxxxxx_xxxxxx 表。
  4. Preview 选项卡查看指标。

第 2 章 将过滤的 Google Cloud 数据集成到成本管理中

要复制导出、对象存储存储桶,并过滤您的数据,以便与红帽共享账单信息的子集,您可以在 Google Cloud 中配置功能脚本。

注意

要向成本管理添加数据集成,您必须拥有具有 Cloud Administrator 权限的红帽帐户。

将您的 Google Cloud 帐户配置为成本管理集成:

  • 为您的成本管理数据创建一个 Google Cloud 项目。
  • 为过滤的报告创建存储桶。
  • 具有具有正确角色的账单服务帐户成员,将您的数据导出到成本管理。
  • 创建一个 BigQuery 数据集来包含成本数据。
  • 创建一个账单导出,将成本管理数据发送到 BigQuery 数据集。

由于您将在 Google Cloud 控制台中完成一些以下步骤,并在成本管理用户界面中完成一些步骤,使这两个应用程序在网页浏览器中打开。

注意

由于第三方产品和文档可能会改变,因此配置第三方集成的说明一般是常规的,并在发布时进行更正。有关最新信息,请参阅 Google Cloud Platform 文档

Integrations 页面将 Google Cloud 集成添加到成本管理。

2.1. 将 Google Cloud 帐户添加为集成

您可以将 Google Cloud 帐户添加为集成。添加 Google Cloud 集成后,成本管理应用程序会处理 Google Cloud 帐户中的成本和使用数据,并使其可以被查看。

先决条件

  • 要向成本管理添加数据集成,您必须拥有具有 Cloud Administrator 权限的红帽帐户。

流程

  1. Red Hat Hybrid Cloud Console 中,点 Settings Menu Settings icon > Integrations
  2. Settings 页面中,在 Cloud 选项卡中点 Add integration
  3. Add a cloud integration 向导中,选择 Google Cloud 作为云供应商类型,然后点 Next
  4. 输入您的集成名称。点击 Next
  5. Select application 步骤中,选择 Cost management 并点 Next

2.2. 创建 Google Cloud 项目

创建 Google Cloud 项目,以收集并发送您的成本报告到成本管理。

先决条件

  • 使用 resourcemanager.projects.create 权限访问 Google Cloud Console

流程

  1. Google Cloud Console 中,点 IAM & AdminCreate a Project
  2. 在出现的新页面中输入项目名称并选择您的账单帐户。
  3. 选择 Organization
  4. Location 框中输入父机构。
  5. Create
  6. 在成本管理 添加云集成 向导中,在 Project 页面中输入您的项目 ID
  7. 要将 Google Cloud 配置为在将数据发送到红帽之前过滤您的数据,请选择 I want to manually custom the data set sent to cost management,点 Next

验证步骤

  1. 进入到 Google Cloud Console Dashboard
  2. 验证项目位于菜单栏中。

其他资源

2.3. 创建 Google Cloud 存储桶

为稍后创建的过滤报告创建存储桶。bucket 是存储数据的容器。

流程

  1. Google Cloud Console 中,点 Buckets
  2. Create bucket
  3. 输入存储桶信息。为您的存储桶命名。在本例中,使用 customer-data
  4. 单击 Create,然后在确认对话框中单击 Confirm
  5. 在成本管理 添加云集成 向导中,在 Create cloud storage bucket 页面中,输入您的云 存储桶名称

其他资源

  • 有关创建存储桶的更多信息,请参阅 Google Cloud 文档中的 创建存储桶

2.4. 创建 Google Cloud Identity and Access Management 角色

用于成本管理的自定义 Identity and Access Management (IAM)角色可以访问启用 Google Cloud Platform 集成并禁止访问其他资源所需的特定成本相关资源。

先决条件

  • 使用这些权限访问 Google Cloud 控制台:

    • resourcemanager.projects.get
    • resourcemanager.projects.getIamPolicy
    • resourcemanager.projects.setIamPolicy
  • Google Cloud 项目

流程

  1. Google Cloud Console 中,点 IAM & AdminRoles
  2. 从菜单栏中的下拉菜单中选择成本管理项目。
  3. 单击 + Create role
  4. 为角色输入 TitleDescriptionID。在本例中,使用 customer-data-role
  5. 单击 + ADD PERMISSIONS
  6. 使用 Enter property name 或 value 字段搜索,并为自定义角色选择这四个权限:

    • storage.objects.get
    • storage.objects.list
    • storage.buckets.get
  7. 单击 ADD
  8. CREATE

其他资源

2.5. 将账单服务帐户成员添加到您的 Google Cloud 项目中

您必须创建一个账单服务帐户成员,该成员可将成本报告导出到项目中的 红帽混合云控制台

先决条件

  • 使用这些权限访问 Google Cloud 控制台:

    • resourcemanager.projects.get
    • resourcemanager.projects.getIamPolicy
    • resourcemanager.projects.setIamPolicy
  • Google Cloud 项目
  • 成本管理身份和访问管理(IAM) 角色

流程

  1. Google Cloud Console 中,点 IAM & AdminIAM
  2. 从菜单栏中的下拉菜单中选择成本管理项目。
  3. 单击 ADD
  4. 将您创建的 IAM 角色粘贴到 New principals 字段中:

    billing-export@red-hat-cost-management.iam.gserviceaccount.com
  5. Assign roles 部分中,分配您创建的 IAM 角色。在本例中,使用 customer-data-role
  6. SAVE

验证步骤

  1. 导航到 IAM & AdminIAM
  2. 验证新成员是否存在正确的角色。

其他资源

2.6. 创建 Google Cloud BigQuery 数据集

创建一个 BigQuery 数据集来收集和存储计费数据以进行成本管理。

先决条件

  • 使用 bigquery.datasets.create 权限访问 Google Cloud Console
  • Google Cloud 项目

流程

  1. Google Cloud Console 中,单击 Big DataBigQuery
  2. Explorer 面板中选择成本管理项目。
  3. 单击 CREATE DATASET
  4. Dataset ID 字段中输入 dataset 的名称。在本例中,使用 CustomerFilteredData
  5. 单击 CREATE DATASET

2.7. 将 Google Cloud billing 数据导出到 BigQuery

为 BigQuery 启用计费导出,将您的 Google Cloud 计费数据(如使用、成本估算和定价数据)自动发送到成本管理 BigQuery 数据集。

先决条件

流程

  1. Google Cloud Console 中,单击 BillingBilling export
  2. 单击 Billing export 选项卡。
  3. 在详细信息 使用成本 部分中点 EDIT SETTINGS
  4. 在下拉菜单中选择 成本管理项目 和计费导出 数据集。
  5. SAVE

验证步骤

  1. 在详细信息 使用成本 部分中,验证标有 Enabled 的复选标记,其具有正确的 项目名称和 数据集名称

2.8. 创建功能,将过滤的数据发布到您的存储桶

创建一个过滤数据的功能,并将其添加到您创建的存储帐户中,以便与红帽共享。您可以使用示例 Python 脚本从与红帽费用相关的成本导出中收集成本数据,并将其添加到存储帐户中。此脚本会过滤您使用 BigQuery 创建的成本数据,删除非红帽信息,然后创建 .csv 文件,将其存储在您创建的存储桶中,并将数据发送到红帽。

流程

  1. Google Cloud Console 中,搜索 secret 并选择 Secret Manager 结果来设置一个 secret,以使用 Red Hat 验证您的功能,而无需将凭证存储在您的功能中。

    1. 在 Secret Manager 页面中,点 Create Secret
    2. 为您的 secret 命名,添加您的红帽用户名,然后点 Create Secret
    3. 重复此过程,为您的红帽密码保存 secret。
  2. 在 Google Cloud Console 搜索栏中,搜索功能并选择 Cloud Functions 结果。
  3. Cloud Functions 页面上,单击 Create function
  4. 将函数命名为。在本例中,使用 customer-data-function
  5. Trigger 部分,点 Save 接受 HTTP Trigger 类型。
  6. Runtime, build, connections and security settings 中,单击 Security and image repository,引用您创建的 secret,点 Done,然后点 Next
  7. Cloud Functions Code 页面中,将运行时设置为 Python 3.9
  8. 打开 requirements.txt 文件。将下面几行粘贴到文件末尾。

    requests
    google-cloud-bigquery
    google-cloud-storage
  9. 打开 main.py 文件。

    1. Entry Point 设置为 get_filtered_data
    2. 粘贴以下 python 脚本。将标记为 # Required vars 的部分中 的值更改为您的环境的值。

      import csv
      import datetime
      import uuid
      import os
      import requests
      from google.cloud import bigquery
      from google.cloud import storage
      from itertools import islice
      from dateutil.relativedelta import relativedelta
      
      query_range = 5
      now = datetime.datetime.now()
      delta = now - relativedelta(days=query_range)
      year = now.strftime("%Y")
      month = now.strftime("%m")
      day = now.strftime("%d")
      report_prefix=f"{year}/{month}/{day}/{uuid.uuid4()}"
      
      # Required vars to update
      USER = os.getenv('username')         # Cost management username
      PASS = os.getenv('password')         # Cost management password
      INTEGRATION_ID = "<integration_id>"  # Cost management integration_id
      BUCKET = "<bucket>"                  # Filtered data GCP Bucket
      PROJECT_ID = "<project_id>"          # Your project ID
      DATASET = "<dataset>"                # Your dataset name
      TABLE_ID = "<table_id>"              # Your table ID
      
      gcp_big_query_columns = [
          "billing_account_id",
          "service.id",
          "service.description",
          "sku.id",
          "sku.description",
          "usage_start_time",
          "usage_end_time",
          "project.id",
          "project.name",
          "project.labels",
          "project.ancestry_numbers",
          "labels",
          "system_labels",
          "location.location",
          "location.country",
          "location.region",
          "location.zone",
          "export_time",
          "cost",
          "currency",
          "currency_conversion_rate",
          "usage.amount",
          "usage.unit",
          "usage.amount_in_pricing_units",
          "usage.pricing_unit",
          "credits",
          "invoice.month",
          "cost_type",
          "resource.name",
          "resource.global_name",
      ]
      table_name = ".".join([PROJECT_ID, DATASET, TABLE_ID])
      
      BATCH_SIZE = 200000
      
      def batch(iterable, n):
          """Yields successive n-sized chunks from iterable"""
          it = iter(iterable)
          while chunk := tuple(islice(it, n)):
              yield chunk
      
      def build_query_select_statement():
          """Helper to build query select statement."""
          columns_list = gcp_big_query_columns.copy()
          columns_list = [
              f"TO_JSON_STRING({col})" if col in ("labels", "system_labels", "project.labels", "credits") else col
              for col in columns_list
          ]
          columns_list.append("DATE(_PARTITIONTIME) as partition_date")
          return ",".join(columns_list)
      
      def create_reports(query_date):
          query = f"SELECT {build_query_select_statement()} FROM {table_name} WHERE DATE(_PARTITIONTIME) = {query_date} AND sku.description LIKE '%RedHat%' OR sku.description LIKE '%Red Hat%' OR  service.description LIKE '%Red Hat%' ORDER BY usage_start_time"
          client = bigquery.Client()
          query_job = client.query(query).result()
          column_list = gcp_big_query_columns.copy()
          column_list.append("partition_date")
          daily_files = []
          storage_client = storage.Client()
          bucket = storage_client.bucket(BUCKET)
          for i, rows in enumerate(batch(query_job, BATCH_SIZE)):
              csv_file = f"{report_prefix}/{query_date}_part_{str(i)}.csv"
              daily_files.append(csv_file)
              blob = bucket.blob(csv_file)
              with blob.open(mode='w') as f:
                  writer = csv.writer(f)
                  writer.writerow(column_list)
                  writer.writerows(rows)
          return daily_files
      
      def post_data(files_list):
          # Post CSV's to console.redhat.com API
          url = "https://console.redhat.com/api/cost-management/v1/ingress/reports/"
          json_data = {"source": INTEGRATION_ID, "reports_list": files_list, "bill_year": year, "bill_month": month}
          resp = requests.post(url, json=json_data, auth=(USER, PASS))
          return resp
      
      def get_filtered_data(request):
          files_list = []
          query_dates = [delta + datetime.timedelta(days=x) for x in range(query_range)]
          for query_date in query_dates:
              files_list += create_reports(query_date.date())
          resp = post_data(files_list)
          return f'Files posted! {resp}'
  10. Deploy

2.9. 触发您的功能,将过滤的数据发布到您的存储桶

创建一个调度程序作业来运行您创建的功能,以便按时间表向红帽发送过滤的数据。

流程

  1. 复制您创建的功能的 Trigger URL,以发布成本报告。您需要将它添加到 Google Cloud 调度程序中。

    1. Google Cloud Console 中,搜索功能并选择 Cloud Functions 结果。
    2. Cloud Functions 页面中,选择您的功能,然后点 Trigger 选项卡。
    3. 在 HTTP 部分中,点 Copy to clipboard
  2. 创建调度程序作业。在 Google Cloud Console 中,搜索 云调度程序 并选择 Cloud Scheduler 结果。
  3. Create job

    1. 为您的调度程序作业命名。在本例中,使用 CustomerFilteredDataSchedule
    2. Frequency 字段中,为希望该函数运行时设置 cron 表达式。在本例中,使用 09*** 在每天上午 9 点运行函数。
    3. 设置时区,然后单击 Continue
  4. 在下一页中配置执行。

    1. Target type 字段中,选择 HTTP
    2. 在 URL 字段中,粘贴您复制的 Trigger URL。
    3. 在 body 字段中,粘贴传递给函数的以下代码来触发它。

      {"name": "Scheduler"}
    4. 在 Auth 标头字段中,选择 Add OIDC token
    5. Service account 字段,点 Create 为调度程序作业创建服务帐户和角色。
  5. Service account details 步骤中,命名您的服务帐户。在本例中,使用 scheduler-service-account。接受 默认服务帐户 ID,再点 Create and Continue

    1. 在 Grand this service account access to project 中,为您的帐户选择两个角色。
    2. 单击 ADD ANOTHER ROLE,然后搜索并选择 Cloud Scheduler Job Runner 和 Cloud Functions Invoker。
    3. Continue
    4. Done 完成服务帐户创建。
  6. 在项目页面的服务账户上,选择您正在使用的调度程序作业。在本例中,名称是 scheduler-service-account
  7. Configure the execution 页面中,选择 Service account 字段,再选择您刚才创建的 scheduler-service-account
  8. 单击 Continue,然后单击 Create

第 3 章 管理成本的后续步骤

添加 OpenShift Container Platform 和 Google Cloud 集成后,在 成本管理 概述 页中,您的成本数据将按照 OpenShiftInfrastructure 标签页进行排序。选择 Perspective 通过成本数据的不同视图切换。

您还可以使用全局导航菜单查看云供应商成本的更多详情。

3.1. 限制对成本管理资源的访问

在成本管理中添加和配置集成后,您可以限制对成本数据和资源的访问。

您可能不希望用户访问所有成本数据。相反,您只能向用户授予特定于其项目或机构的数据的访问权限。通过基于角色的访问控制,您可以限制成本管理报告中的资源的可见性。例如,您可以将用户的视图限制为只有 AWS 集成,而不是整个环境。

要了解如何限制访问,请参阅更深入的指南 限制对成本管理资源的访问

3.2. 为您的集成配置标记

成本管理应用程序通过标签跟踪云和基础架构成本。在 OpenShift 中,标签也称为标签。

您可以在成本管理中优化标签,过滤和属性资源,按成本组织资源,并为云基础架构的不同部分分配成本。

重要

您只能直接在集成上配置标签和标签。您可以选择在成本管理中激活的标签,但无法在成本管理应用程序中编辑标签和标签。

要了解更多有关以下主题的信息,请参阅使用标记管理成本数据

  • 规划标记策略以组织您的成本数据视图
  • 了解成本管理关联标签的方式
  • 在集成上配置标签和标签

3.3. 配置成本模型以准确报告成本

现在,您已将集成配置为以成本管理方式收集成本和使用数据,您可以配置成本模型,将价格与指标和使用相关联。

成本模型是一个框架,它使用原始成本和指标来定义成本管理成本的计算。您可以记录、分类和分发成本模型给特定客户、业务单元或项目产生的成本。

成本 模型中,您可以完成以下任务:

  • 将成本分类为基础架构或补充成本
  • 捕获 OpenShift 节点和集群的每月成本
  • 应用标记以考虑其他支持成本

要了解如何配置成本模型,请参阅使用成本模型

3.4. 使用 Cost Explorer 可视化您的成本

使用成本管理 Cost Explorer 创建时间扩展成本和使用信息的自定义图形,并最终视觉化并解释您的成本。

要了解更多有关以下主题的信息,请参阅使用 Cost Explorer 可视化您的成本

  • 使用 Cost Explorer 识别异常事件
  • 了解如何随着时间推移您的成本数据变化
  • 为您的成本和使用数据创建自定义条图表
  • 导出自定义成本数据表

对红帽文档提供反馈

如果您发现了错误,或者对如何改进这些指南有建议,请在 成本管理 JIRA 板 中创建一个问题并添加 Documentation 标签。

非常感谢您的反馈意见!

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.