AWS 서비스와 상호 작용
Greengrass 코어 디바이스는 X.509 인증서를 사용하여 TLS 상호 인증 프로토콜을 사용하는 AWS IoT Core에 연결합니다. 이러한 인증서를 사용하면 디바이스가 일반적으로 액세스 키 ID 및 비밀 액세스 키로 구성되는 AWS 자격 증명 없이 AWS IoT와 상호 작용할 수 있습니다. 다른 AWS 서비스는 서비스 엔드포인트에서 API 작업을 직접 호출하려면 X.509 인증서 대신 AWS 자격 증명이 필요합니다. AWS IoT Core에는 디바이스가 X.509 인증서를 사용하여 AWS 요청을 인증할 수 있도록 하는 자격 증명 공급자가 있습니다. AWS IoT 자격 증명 공급자는 X.509 인증서를 사용하여 디바이스를 인증하고 제한된 권한의 임시 보안 토큰 형태로 AWS 자격 증명을 발급합니다. 디바이스는 이 토큰을 사용하여 모든 AWS 요청을 서명하고 인증할 수 있습니다. 이렇게 하면 Greengrass 코어 디바이스에 AWS 자격 증명을 저장할 필요가 없습니다. 자세한 내용은 AWS IoT Core 개발자 안내서의 AWS 서비스 직접 호출에 대한 권한 부여를 참조하세요.
AWS IoT에서 자격 증명을 가져오려면 코어 디바이스는 IAM 역할을 가리키는 AWS IoT 역할 별칭을 사용합니다. 이 IAM 역할을 토큰 교환 역할이라고 합니다. AWS IoT Greengrass 코어 소프트웨어를 설치할 때 역할 별칭과 토큰 교환 역할을 생성합니다. 코어 디바이스가 사용하는 역할 별칭을 지정하려면 Greengrass nucleus의 iotRoleAlias
파라미터를 구성합니다.
AWS IoT 자격 증명 공급자는 사용자를 대신하여 토큰 교환 역할을 수임하여 코어 디바이스에 AWS 자격 증명을 제공합니다. 이 역할에 적절한 IAM 정책을 연결하여 코어 디바이스가 S3 버킷의 구성 요소 아티팩트와 같은 AWS 리소스에 액세스할 수 있습니다. 토큰 교환 역할을 구성하는 방법에 대한 자세한 내용은 코어 디바이스에 AWS 서비스와 상호 작용 권한 부여 섹션을 참조하세요.
Greengrass 코어 디바이스는 AWS 자격 증명을 메모리에 저장하며 자격 증명은 기본적으로 1시간 후에 만료됩니다. AWS IoT Greengrass 코어 소프트웨어가 다시 시작되면 자격 증명을 다시 가져와야 합니다. UpdateRoleAlias 작업을 사용하여 자격 증명이 유효한 기간을 구성할 수 있습니다.
AWS IoT Greengrass는 AWS 서비스와 상호 작용할 사용자 지정 구성 요소의 종속성으로 정의할 수 있는 토큰 교환 서비스 구성 요소인 퍼블릭 구성 요소를 제공합니다. 토큰 교환 서비스는 AWS 자격 증명을 제공하는 로컬 서버에 대한 URI를 정의하는 환경 변수인 AWS_CONTAINER_CREDENTIALS_FULL_URI
를 구성 요소에 제공합니다. AWS SDK 클라이언트를 생성할 때 클라이언트는 이 환경 변수를 확인하고 로컬 서버에 연결하여 AWS 자격 증명을 검색하고 이를 사용하여 API 요청에 서명합니다. 이렇게 하면 AWS SDK 및 기타 도구를 사용하여 구성 요소의 AWS 서비스를 호출할 수 있습니다. 자세한 내용은 토큰 교환 서비스 섹션을 참조하세요.
중요
이러한 방식으로 AWS 자격 증명을 획득하도록 하는 지원은 2016년 7월 13일에 AWS SDK에 추가되었습니다. 구성 요소는 이 날짜 이후에 생성된 AWS SDK 버전을 사용해야 합니다. 자세한 내용은 Amazon Elastic Container Service 개발자 안내서의 지원되는 AWS SDK 사용을 참조하세요.
사용자 지정 구성 요소에서 AWS 자격 증명을 획득하려면 구성 요소 레시피에서 aws.greengrass.TokenExchangeService
를 종속성으로 정의합니다. 다음 예제 레시피에서는 boto3
참고
이 예제 구성 요소를 실행하려면 디바이스에 s3:ListAllMyBuckets
권한이 있어야 합니다. 자세한 내용은 코어 디바이스에 AWS 서비스와 상호 작용 권한 부여 섹션을 참조하세요.
이 예제 구성 요소는 Amazon S3 버킷을 나열하는 다음 Python 스크립트 list_s3_buckets.py
를 실행합니다.
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)