

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS 서비스와 상호 작용
<a name="interact-with-aws-services"></a>

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 서비스 직접 호출에 대한 권한 부여](https://docs.aws.amazon.com/iot/latest/developerguide/authorizing-direct-aws.html)를 참조하세요.

AWS IoT에서 자격 증명을 가져오려면 코어 디바이스는 IAM 역할을 가리키는 AWS IoT 역할 별칭을 사용합니다. 이 IAM 역할을 *토큰 교환 역할*이라고 합니다. AWS IoT Greengrass 코어 소프트웨어를 설치할 때 역할 별칭과 토큰 교환 역할을 생성합니다. 코어 디바이스가 사용하는 역할 별칭을 지정하려면 [Greengrass nucleus](greengrass-nucleus-component.md)의 `iotRoleAlias` 파라미터를 구성합니다.

AWS IoT 자격 증명 공급자는 사용자를 대신하여 토큰 교환 역할을 수임하여 코어 디바이스에 AWS 자격 증명을 제공합니다. 이 역할에 적절한 IAM 정책을 연결하여 코어 디바이스가 S3 버킷의 구성 요소 아티팩트와 같은 AWS 리소스에 액세스할 수 있습니다. 토큰 교환 역할을 구성하는 방법에 대한 자세한 내용은 [코어 디바이스가 AWS 서비스와 상호 작용할 수 있도록 권한 부여](device-service-role.md) 섹션을 참조하세요.

Greengrass 코어 디바이스는 AWS 자격 증명을 메모리에 저장하며 자격 증명은 기본적으로 1시간 후에 만료됩니다. AWS IoT Greengrass 코어 소프트웨어가 다시 시작되면 자격 증명을 다시 가져와야 합니다. [UpdateRoleAlias](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateRoleAlias.html) 작업을 사용하여 자격 증명이 유효한 기간을 구성할 수 있습니다.

AWS IoT Greengrass는 AWS 서비스와 상호 작용할 사용자 지정 구성 요소의 종속성으로 정의할 수 있는 토큰 교환 서비스 구성 요소인 퍼블릭 구성 요소를 제공합니다. 토큰 교환 서비스는 AWS 자격 증명을 제공하는 로컬 서버에 대한 URI를 정의하는 환경 변수인 `AWS_CONTAINER_CREDENTIALS_FULL_URI`를 구성 요소에 제공합니다. AWS SDK 클라이언트를 생성할 때 클라이언트는 이 환경 변수를 확인하고 로컬 서버에 연결하여 AWS 자격 증명을 검색하고 이를 사용하여 API 요청에 서명합니다. 이렇게 하면 AWS SDK 및 기타 도구를 사용하여 구성 요소의 AWS 서비스를 호출할 수 있습니다. 자세한 내용은 [토큰 교환 서비스](token-exchange-service-component.md) 섹션을 참조하세요.

**중요**  <a name="token-exchange-service-aws-sdk-requirement"></a>
이러한 방식으로 AWS 자격 증명을 획득하도록 하는 지원은 2016년 7월 13일에 AWS SDK에 추가되었습니다. 구성 요소는 이 날짜 이후에 생성된 AWS SDK 버전을 사용해야 합니다. 자세한 내용은 *Amazon Elastic Container Service 개발자 안내서*의 [지원되는 AWS SDK 사용](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html#task-iam-roles-minimum-sdk)을 참조하세요.

사용자 지정 구성 요소에서 AWS 자격 증명을 획득하려면 구성 요소 레시피에서 `aws.greengrass.TokenExchangeService`를 종속성으로 정의합니다. 다음 예제 레시피에서는 [boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)를 설치하고 토큰 교환 서비스의 AWS 자격 증명을 사용하여 Amazon S3 버킷을 나열하는 Python 스크립트를 실행하는 구성 요소를 정의합니다.

**참고**  
이 예제 구성 요소를 실행하려면 디바이스에 `s3:ListAllMyBuckets` 권한이 있어야 합니다. 자세한 내용은 [코어 디바이스가 AWS 서비스와 상호 작용할 수 있도록 권한 부여](device-service-role.md) 섹션을 참조하세요.

------
#### [ 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": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "install": "pip3 install --user boto3",
        "Run": "python3 -u {artifacts:path}/list_s3_buckets.py"
      }
    },
    {
      "Platform": {
        "os": "windows"
      },
      "Lifecycle": {
        "install": "pip3 install --user boto3",
        "Run": "py -3 -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:
  - Platform:
      os: linux
    Lifecycle:
      install:
        pip3 install --user boto3
      Run: |-
        python3 -u {artifacts:path}/list_s3_buckets.py
  - Platform:
      os: windows
    Lifecycle:
      install:
        pip3 install --user boto3
      Run: |-
        py -3 -u {artifacts:path}/list_s3_buckets.py
```

------

이 예제 구성 요소는 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)
```