

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

# 자습서: AWS IoT SiteWise Edge 게이트웨이의 자산 모델 나열
<a name="edge-apis-tutorial"></a>

엣지별 API와 함께 사용 가능한 AWS IoT SiteWise APIs의 하위 집합을 사용하여 엣지에서 자산 모델 및 해당 자산과 상호 작용할 수 있습니다. APIs 이 자습서에서는 Edge 게이트웨이에 대한 임시 자격 증명을 가져오고 SiteWise AWS IoT SiteWise Edge 게이트웨이에서 자산 모델 목록을 가져오는 방법을 안내합니다.

## 사전 조건
<a name="edge-apis-tutorial-prerequisites"></a>

이 자습서의 단계에서는 다양한 도구를 사용할 수 있습니다. 이러한 도구를 사용하려면 해당 필수 조건이 설치되어 있어야 합니다.

이 자습서를 완료하려면 다음이 필요합니다.
+ 배포 및 실행 중인 [AWS IoT SiteWise 엣지 자체 호스팅 게이트웨이 요구 사항](configure-gateway-ggv2.md)
+ 포트 443을 통해 동일한 네트워크의 SiteWise Edge 게이트웨이에 액세스합니다.
+ [OpenSSL](https://www.openssl.org/) 설치됨
+ (AWS OpsHub for AWS IoT SiteWise) [AWS OpsHubAWS IoT SiteWise 애플리케이션용](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/manage-gateways-ggv2.html#opshub-app)
+ (curl) [curl](https://ec.haxx.se/install/) 설치됨
+ (Python) [urllib3](https://urllib3.readthedocs.io/en/stable/index.html) 설치됨
+ (Python) [Python3](https://www.python.org/downloads/) 설치됨
+ (Python) [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html) 설치됨
+ (Python) [BotoCore](https://botocore.amazonaws.com/v1/documentation/api/latest/index.html) 설치됨

## 1단계: SiteWise Edge 게이트웨이 서비스 서명 인증서 가져오기
<a name="edge-apis-tutorial-gateway-cert"></a>

SiteWise Edge 게이트웨이에서 사용할 수 있는 API에 TLS 연결을 설정하려면 신뢰할 수 있는 인증서가 필요합니다. OpenSSL 또는를 사용하여이 인증서를 생성할 수 AWS OpsHub 있습니다 AWS IoT SiteWise.

------
#### [ OpenSSL ]

**참고**  
이 명령을 실행하려면 [OpenSSL](https://www.openssl.org/)이 설치되어 있어야 합니다.

SiteWise Edge 게이트웨이에서 서명된 인증서를 가져오려면 터미널을 열고 다음 명령을 실행합니다. `<sitewise_gateway_ip>`를 SiteWise Edge 게이트웨이의 IP로 바꿉니다.

```
openssl s_client -connect <sitewise_gateway_ip>:443 </dev/null 2>/dev/null | openssl x509 -outform PEM > GatewayCert.pem
```

------
#### [ AWS OpsHub for AWS IoT SiteWise ]

를 AWS OpsHub 에 사용할 수 있습니다 AWS IoT SiteWise. 자세한 내용은 [SiteWise Edge 게이트웨이 관리](manage-gateways-ggv2.md) 단원을 참조하십시오.

------

이 자습서에서는 다운로드한 SiteWise Edge 게이트웨이 인증서의 절대 경로를 사용합니다. 다음 명령을 실행하여 인증서의 전체 경로를 내보내고 `<absolute_path_to_certificate>`를 인증서 경로로 대체합니다.

```
export PATH_TO_CERTIFICATE='<absolute_path_to_certificate>'
```

## 2단계: SiteWise Edge 게이트웨이 호스트 이름 가져오기
<a name="edge-apis-tutorial-gateway-hostname"></a>

**참고**  
이 명령을 실행하려면 [OpenSSL](https://www.openssl.org/)이 설치되어 있어야 합니다.

자습서를 완료하려면 SiteWise Edge 게이트웨이의 호스트 이름이 필요합니다. SiteWise Edge 게이트웨이의 호스트 이름을 가져오려면 `<sitewise_gateway_ip>`를 SiteWise Edge 게이트웨이의 IP로 대체하여 다음을 실행합니다.

```
openssl s_client -connect <sitewise_gateway_ip>:443 </dev/null 2>/dev/null | grep -Po 'CN = \K.*'| head -1
```

다음 명령을 실행하여 나중에 사용할 수 있도록 호스트 이름을 내보내고 `<your_edge_gateway_hostname>`을 SiteWise Edge 게이트웨이의 호스트 이름으로 대체합니다.

```
export GATEWAY_HOSTNAME='<your_edge_gateway_hostname>'
```

## 3단계: SiteWise Edge 게이트웨이의 임시 자격 증명 가져오기
<a name="edge-apis-tutorial-temporary-credentials"></a>

이제 서명된 인증서와 SiteWise Edge 게이트웨이의 호스트 이름을 가지고 있으므로 SiteWise Edge 게이트웨이에서 API를 실행할 수 있도록 임시 자격 증명을 가져와야 합니다. AWS OpsHub 용를 통해 AWS IoT SiteWise 또는 API를 사용하여 SiteWise Edge 게이트웨이에서 직접 이러한 자격 증명을 가져올 수 있습니다. APIs

**중요**  
자격 증명은 4시간마다 만료되므로 SiteWise Edge 게이트웨이에서 API를 사용하기 직전에 자격 증명을 가져와야 합니다. 보안 인증을 4시간 이상 캐시하지 마세요.

### AWS OpsHub 용를 사용하여 임시 자격 증명 가져오기 AWS IoT SiteWise
<a name="edge-apis-tutorial-temp-creds-opshub"></a>

**참고**  
[AWS OpsHubAWS IoT SiteWise 애플리케이션용](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/manage-gateways-ggv2.html#opshub-app)가 설치되어 있어야 합니다.

 AWS OpsHub 를 AWS IoT SiteWise 애플리케이션에 사용하여 임시 자격 증명을 가져오려면 다음을 수행합니다.

1. 애플리케이션에 로그인합니다.

1. **설정**을 선택합니다.

1. **인증**에서 **보안 인증 복사**를 선택합니다.

1. 환경에 맞는 옵션을 확장하고 **복사**를 선택합니다.

1. 나중에 사용할 수 있도록 보안 인증을 저장합니다.

### SiteWise Edge 게이트웨이 API를 사용하여 임시 자격 증명 가져오기
<a name="edge-apis-tutorial-temp-creds-api"></a>

SiteWise Edge 게이트웨이 API를 사용하여 임시 자격 증명을 가져오려면 Python 스크립트 또는 curl을 사용할 수 있습니다. 먼저 SiteWise Edge 게이트웨이의 사용자 이름과 암호가 있어야 합니다. SiteWise Edge 게이트웨이는 SigV4 인증 및 권한 부여를 사용합니다. 사용자 추가에 대한 자세한 내용은 [LDAP](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/manage-gateways-ggv2.html#opshub-app) 또는 [Linux 사용자 풀](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/manage-gateways-ggv2.html#opshub-app)을 참조하세요. 이러한 자격 증명은 다음 단계에서 API를 사용하는 데 필요한 SiteWise Edge 게이트웨이의 로컬 자격 증명을 가져오는 데 사용됩니다 AWS IoT SiteWise APIs.

------
#### [ Python ]

**참고**  
[urllib3](https://urllib3.readthedocs.io/en/stable/index.html)와 [Python3](https://www.python.org/downloads/)이 설치되어 있어야 합니다.

**Python을 사용하여 보안 인증을 가져오려면**

1. **get\$1credentials.py**라는 파일을 생성하고 다음 코드를 그 안에 복사합니다.

   ```
   '''
   The following demonstrates how to get the credentials from the SiteWise Edge gateway. You will need to add local users or connect your system to LDAP/AD
   https://docs.aws.amazon.com/iot-sitewise/latest/userguide/manage-gateways-ggv2.html#create-user-pool
   
   Example usage:
       python3 get_credentials.py -e https://<gateway_hostname> -c <path_to_certificate> -u '<gateway_username>' -p '<gateway_password>' -m '<method>'
   '''
   import urllib3
   import json
   import urllib.parse
   import sys
   import os
   import getopt
   
   """
   This function retrieves the AWS IoT SiteWise Edge gateway credentials.
   """
   def get_credentials(endpoint,certificatePath, user, password, method):
       http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs= certificatePath)
       encoded_body = json.dumps({
           "username": user,
           "password": password,
           "authMechanism": method,
       })
   
       url =  urllib.parse.urljoin(endpoint, "/authenticate")
   
       response = http.request('POST', url,
           headers={'Content-Type': 'application/json'}, 
           body=encoded_body)
       
       if response.status != 200:
           raise Exception(f'Failed to authenticate! Response status {response.status}')
   
       auth_data = json.loads(response.data.decode('utf-8'))
   
       accessKeyId = auth_data["accessKeyId"]
       secretAccessKey = auth_data["secretAccessKey"]
       sessionToken = auth_data["sessionToken"]
       region = "edge"
   
       return accessKeyId, secretAccessKey, sessionToken, region
   
   def print_help():
       print('Usage:')
       print(f'{os.path.basename(__file__)} -e <endpoint> -c <path/to/certificate> -u <user> -p <password> -m <method> -a <alias>')
       print('')
       print('-e, --endpoint   edge gateway endpoint. Usually the Edge gateway hostname.')
       print('-c, --cert_path path to downloaded gateway certificate')
       print('-u, --user       Edge user')
       print('-p, --password   Edge password')
       print('-m, --method     (Optional) Authentication method (linux, winnt, ldap), default is linux')
       sys.exit()
   
   
   def parse_args(argv):
       endpoint = ""
       certificatePath = None
       user = None
       password = None
       method = "linux"
       
       try:
           opts, args = getopt.getopt(argv, "he:c:u:p:m:", ["endpoint=","cert_path=", "user=", "password=", "method="])
       except getopt.GetoptError:
           print_help()
   
       for opt, arg in opts:
           if opt == '-h':
               print_help()
           elif opt in ("-e", "--endpoint"):
               endpoint = arg
           elif opt in ("-u", "--user"):
               user = arg
           elif opt in ("-p", "--password"):
               password = arg
           elif opt in ("-m", "--method"):
               method = arg.lower()
           elif opt in ("-c", "--cert_path"):
               certificatePath = arg
   
       if method not in ['ldap', 'linux', 'winnt']:
           print("not valid method parameter, required are ldap, linux, winnt")
           print_help()
   
       if (user == None or password == None):
           print("To authenticate against edge user, password have to be passed together, and the region has to be set to 'edge'")
           print_help()
       
       if(endpoint == ""):
           print("You must provide a valid and reachable gateway hostname")
           print_help()
   
       return endpoint,certificatePath, user, password, method
   
   
   def main(argv):
       # get the command line args
       endpoint, certificatePath, user, password, method = parse_args(argv)
       
       accessKeyId, secretAccessKey, sessionToken, region=get_credentials(endpoint, certificatePath, user, password, method)
   
       print("Copy and paste the following credentials into the shell, they are valid for 4 hours:")
       print(f"export AWS_ACCESS_KEY_ID={accessKeyId}")
       print(f"export AWS_SECRET_ACCESS_KEY={secretAccessKey}")
       print(f"export AWS_SESSION_TOKEN={sessionToken}")
       print(f"export AWS_REGION={region}")
       print()
       
       
       
   
   if __name__ == "__main__":
      main(sys.argv[1:])
   ```

1. 터미널에서 **get\$1credentials.py**를 실행하여 `<gateway_username>` 및 `<gateway_password>`를 생성한 보안 인증으로 교체합니다.

   ```
   python3 get_credentials.py -e https://$GATEWAY_HOSTNAME -c $PATH_TO_CERTIFICATE -u '<gateway_username>' -p '<gateway_password>' -m 'linux'
   ```

------
#### [ curl ]

**참고**  
[curl](https://ec.haxx.se/install/)이 설치되어 있어야 합니다.

**curl을 사용하여 보안 인증을 가져오려면**

1. <gateway\$1username> 및 <gateway\$1password>를 생성한 자격 증명으로 교체하여 터미널에서 다음 명령을 실행합니다.

   ```
   curl --cacert $PATH_TO_CERTIFICATE --location \
   -X POST https://$GATEWAY_HOSTNAME:443/authenticate \
   --header 'Content-Type: application/json' \
   --data-raw '{
       "username": "<gateway_username>",
       "password": "<gateway_password>",
       "authMechanism": "linux"
   }'
   ```

   응답은 다음과 같아야 합니다.

   ```
   {
       "username": "sweuser",
       "accessKeyId": "<accessKeyId>",
       "secretAccessKey": "<secretAccessKey>",
       "sessionToken": "<sessionToken>",
       "sessionExpiryTime": "2022-11-17T04:51:40.927095Z",
       "authMechanism": "linux",
       "role": "edge-user"
   }
   ```

1. 터미널에서 다음 명령을 실행합니다.

   ```
   export AWS_ACCESS_KEY_ID=<accessKeyId>
   export AWS_SECRET_ACCESS_KEY=<secretAccessKey>
   export AWS_SESSION_TOKEN=<sessionToken>
   export AWS_REGION=edge
   ```

------

## 4단계: SiteWise Edge 게이트웨이의 자산 모델 목록 가져오기
<a name="edge-apis-tutorial-get-asset-models"></a>

서명된 인증서, SiteWise Edge 게이트웨이 호스트 이름, SiteWise Edge 게이트웨이의 임시 자격 증명이 준비되었으므로 `ListAssetModels` API를 사용하여 SiteWise Edge 게이트웨이의 자산 모델 목록을 가져올 수 있습니다.

------
#### [ Python ]

**참고**  
[Python3](https://www.python.org/downloads/), [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html), [BotoCore](https://botocore.amazonaws.com/v1/documentation/api/latest/index.html)가 설치되어 있어야 합니다.

**Python을 사용하여 자산 모델 목록을 가져오려면**

1. **list\$1asset\$1model.py**라는 파일을 만들고 그 안에 다음 코드를 복사합니다.

   ```
   import json
   import boto3
   import botocore
   import os
   
   # create the client using the credentials
   client = boto3.client("iotsitewise", 
       endpoint_url= "https://"+ os.getenv("GATEWAY_HOSTNAME"),
       region_name=os.getenv("AWS_REGION"), 
       aws_access_key_id=os.getenv("AWS_ACCESS_KEY_ID"), 
       aws_secret_access_key=os.getenv("AWS_SECRET_ACCESS_KEY"), 
       aws_session_token=os.getenv("AWS_SESSION_TOKEN"),
       verify=os.getenv("PATH_TO_CERTIFICATE"),
       config=botocore.config.Config(inject_host_prefix=False))
   
   # call the api using local credentials
   response = client.list_asset_models()
   print(response)
   ```

1. 터미널에서 **list\$1asset\$1model.py**를 실행합니다.

   ```
   python3 list_asset_model.py
   ```

------
#### [ curl ]

**참고**  
[curl](https://ec.haxx.se/install/)이 설치되어 있어야 합니다.

**curl을 사용하여 자산 모델 목록을 가져오려면**

터미널에서 다음 명령을 실행합니다.

```
curl \
  --request GET https://$GATEWAY_HOSTNAME:443/asset-models \
  --cacert $PATH_TO_CERTIFICATE \
  --aws-sigv4 "aws:amz:edge:iotsitewise" \
  --user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \
  -H "x-amz-security-token:$AWS_SESSION_TOKEN"
```

응답은 다음과 같아야 합니다.

```
{
    "assetModelSummaries": [
        {
            "arn": "arn:aws:iotsitewise:{region}:{account-id}:asset-model/{asset-model-id}",
            "creationDate": 1.669245291E9,
            "description": "This is a small example asset model",
            "id": "{asset-model-id}",
            "lastUpdateDate": 1.669249038E9,
            "name": "Some Metrics Model",
            "status": {
                "error": null,
                "state": "ACTIVE"
            }
        },
        .
        .
        .
    ],
    "nextToken": null
}
```

------