与 AWS 服务交互 - AWS IoT Greengrass
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

与 AWS 服务交互

Greengrass 核心设备使用 X.509 证书通过 TLS 双向身份验证协议连接到 AWS AWS IoT Core。这些证书允许设备在没有 AWS 凭证的情况下与 AWS AWS IoT 进行交互,这通常包含一个访问密钥 ID 和一个秘密访问密钥。其他 AWS 服务需要 AWS 凭证而不是 X.509 证书才能在服务终端节点中调用 API 操作。AWS AWS IoT Core 具有凭证提供程序,使设备能够使用其 X.509 证书对 AWS 请求进行身份验证。AWS AWS IoT 凭证提供程序使用 X.509 证书对设备进行身份验证,并以具有有限权限的临时安全令牌形式颁发 AWS 凭证。设备可以使用此令牌对任何 AWS 请求进行签名和身份验证。这样,便无需在 Greengrass 核心设备上存储 AWS 凭证。有关更多信息,请参阅《AWS AWS IoT Core 开发人员指南》中的“授权直接调用 AWS 服务”。

要从 AWS AWS IoT (Greengrass) 获取凭证,核心设备使用指向 IAM 角色的 AWS AWS IoT 角色别名。此 IAM 角色称为令牌交换角色。安装 AWS AWS IoT Greengrass 核心软件时,您可以创建角色别名和令牌交换角色。要指定核心设备使用的角色别名,请配置 的 iotRoleAlias 参数Greengrass 核心

AWS AWS IoT 凭证提供程序将代表您代入令牌交换角色,以便向核心设备提供 AWS 凭证。您可以将适当的 IAM 策略附加到此角色,以允许核心设备访问您的 AWS 资源,例如 S3 存储桶中的组件构件。有关如何配置令牌交换角色的更多信息,请参阅授权核心设备与 AWS 服务交互

Greengrass 核心设备将 AWS 凭证存储在内存中,默认情况下凭证将在 1 小时后过期。如果 AWS AWS IoT Greengrass 核心软件重新启动,则它必须再次获取凭证。您可以使用 UpdateRoleAlias操作来配置凭证的有效期。

AWS AWS IoT Greengrass 提供了一个公有组件 (令牌交换服务组件),您可以将其定义为自定义组件中的依赖项以与 AWS 服务交互。令牌交换服务为您的组件提供环境变量 AWS_CONTAINER_CREDENTIALS_FULL_URI,该变量定义提供 AWS 凭证的本地服务器的 URI。当您创建 AWS 开发工具包客户端时,客户端将检查此环境变量,并连接到本地服务器以检索 AWS 凭证,然后使用这些凭证签署 API 请求。这允许您使用 AWS SDKs和其他工具在组件中调用 AWS 服务。有关更多信息,请参阅令牌交换服务

重要

2016 年 7 13th在 AWS SDKs中增加了对此方式获取 AWS 凭证的支持。您的组件必须使用在该日期或之后创建的 AWS 开发工具包版本。有关更多信息,请参阅《Amazon Elastic Container Service 开发人员指南》中的“使用支持的 AWS 开发工具包”。

要在自定义组件中获取 AWS 凭证,请将 aws.greengrass.TokenExchangeService 定义为组件配方中的依赖项。以下示例配方定义一个组件,该组件安装 boto3 并运行 Python 脚本,该脚本使用令牌交换服务中的 AWS 凭证列出 Amazon S3 存储桶。

注意

要运行此示例组件,您的设备必须具有 s3:ListAllMyBuckets 权限。有关更多信息,请参阅授权核心设备与 AWS 服务交互

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.ListS3Buckets", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that uses the token exchange service to list S3 buckets.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.TokenExchangeService": { "VersionRequirement": "^2.0.0", "DependencyType": "HARD" } }, "Manifests": [ { "Lifecycle": { "Install": "pip3 install --user boto3", "Run": "python3 -u {artifacts:path}/list_s3_buckets.py" } } ] }
YAML
--- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.ListS3Buckets ComponentVersion: '1.0.0' ComponentDescription: A component that uses the token exchange service to list S3 buckets. ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.TokenExchangeService: VersionRequirement: '^2.0.0' DependencyType: HARD Manifests: - Lifecycle: Install: pip3 install --user boto3 Run: |- python3 -u {artifacts:path}/list_s3_buckets.py

此示例组件运行以下 Python 脚本list_s3_buckets.py,其中列出了 Amazon S3 存储桶。

import boto3 import os try: print("Creating boto3 S3 client...") s3 = boto3.client('s3') print("Successfully created boto3 S3 client") except Exception as e: print("Failed to create boto3 s3 client. Error: " + str(e)) exit(1) try: print("Listing S3 buckets...") response = s3.list_buckets() for bucket in response['Buckets']: print(f'\t{bucket["Name"]}') print("Successfully listed S3 buckets") except Exception as e: print("Failed to list S3 buckets. Error: " + str(e)) exit(1)