与 AWS 服务交互
Greengrass 核心设备使用 X.509 证书,通过 TLS 双向身份验证协议连接到 AWS IoT Core。这些证书允许设备在没有 AWS 凭证的情况下与 AWS IoT 交互。凭证通常包含访问密钥 ID 和秘密访问密钥。其他 AWS 服务需要有 AWS 凭证(而不是 X.509 证书),才能在服务端点调用 API 操作。AWS IoT Core 拥有凭证提供程序,允许设备使用其 X.509 证书对 AWS 请求进行身份验证。AWS IoT 凭证提供程序使用 X.509 证书对设备进行身份验证,并且以有限权限临时安全令牌的形式签发 AWS 凭证。设备可以使用此令牌对任何 AWS 请求进行签名和身份验证。这样就无需在 Greengrass 核心设备上存储 AWS 凭证。有关更多信息,请参阅《AWS IoT Core 开发人员指南》中的授权直接调用 AWS 服务。
为从 AWS IoT 获取凭证,Greengrass 核心设备使用指向 IAM 角色的 AWS IoT 角色别名。此 IAM 角色称为令牌交换角色。在安装 AWS IoT Greengrass Core 软件时,您可以创建角色别名和令牌交换角色。要指定核心设备使用的角色别名,请配置 Greengrass Nucleus 的 iotRoleAlias
参数。
AWS IoT 凭证提供程序代表您担任令牌交换角色,为核心设备提供 AWS 凭证。您可以将合适的 IAM 策略附加到此角色,以允许核心设备访问 AWS 资源,例如 S3 存储桶中的组件构件。有关如何配置令牌交换角色的更多信息,请参阅授权核心设备与 AWS 服务交互。
Greengrass 核心设备将 AWS 凭证存储在内存中。默认情况下,凭证会在 1 小时后过期。如果 AWS IoT Greengrass Core 软件重新启动,则必须重新获取凭证。您可以使用 UpdateRoleAlias 操作来配置凭证的有效期限。
AWS IoT Greengrass 提供一个公有组件,即令牌交换服务组件。您可以将该组件定义为自定义组件中的依赖关系,以与 AWS 服务交互。令牌交换服务为组件提供一个环境变量 AWS_CONTAINER_CREDENTIALS_FULL_URI
。该变量为提供 AWS 凭证的本地服务器定义 URI。在您创建 AWS SDK 客户端时,该客户端会检查此环境变量并连接到本地服务器,以检索 AWS 凭证并使用这些凭证签署 API 请求。这样,您就可以使用 AWS SDK 和其他工具来调用组件中的 AWS 服务。有关更多信息,请参阅 令牌交换服务。
重要
从 2016 年 7 月 13 日起,AWS SDK 支持以这种方式获取 AWS 凭证。您的组件必须使用在该日期或之后创建的 AWS SDK 版本。有关更多信息,请参阅《Amazon Elastic Container Service 开发人员指南》中的使用支持的 AWS SDK。
要在自定义组件中获取 AWS 凭证,请将 aws.greengrass.TokenExchangeService
定义为组件配方中的依赖关系。以下示例配方定义了一个组件,该组件用于安装 boto3
注意
要运行此示例组件,您的设备必须具有 s3:ListAllMyBuckets
权限。有关更多信息,请参阅 授权核心设备与 AWS 服务交互。
此示例组件运行以下 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)