

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

# 4단계: 디바이스에서 구성 요소 개발 및 테스트
<a name="create-first-component"></a>

구성 요소는 AWS IoT Greengrass 코어 디바이스에서 실행되는 소프트웨어 모듈입니다. 구성 요소를 사용하면 복잡한 애플리케이션을 여기저기 Greengrass 코어 디바이스에서 재사용할 수 있는 불연속 빌딩 블록으로 생성하고 관리할 수 있습니다. 모든 구성 요소는 *레시피*와 *아티팩트 *로 구성되어 있습니다.
+ <a name="component-recipe-definition"></a>**레시피**

  모든 구성 요소에는 메타데이터가 정의되는 레시피 파일이 있습니다. 레시피에서는 구성 요소의 구성 파라미터, 구성 요소 종속성, 수명 주기 및 플랫폼 호환성도 지정됩니다. 구성 요소 수명 주기에서는 구성 요소 설치, 실행 및 종료 명령이 정의됩니다. 자세한 내용은 [AWS IoT Greengrass 구성 요소 레시피 참조](component-recipe-reference.md) 단원을 참조하십시오.

  레시피를 [JSON](https://en.wikipedia.org/wiki/JSON) 또는 [YAML](https://en.wikipedia.org/wiki/YAML) 형식으로 정의할 수 있습니다.
+ <a name="component-artifacts-definition"></a>**아티팩트**

  구성 요소의 구성 요소 바이너리인 아티팩트는 수량 제한이 없습니다. 아티팩트에는 구성 요소에서 사용되는 스크립트, 컴파일된 코드, 정적 리소스 및 기타 파일이 포함될 수 있습니다. 구성 요소에서는 구성 요소 종속성의 아티팩트도 사용될 수도 있습니다.

를 사용하면 Greengrass CLI를 사용하여 AWS 클라우드와의 상호 작용 없이 Greengrass 코어 디바이스에서 로컬로 구성 요소를 개발하고 테스트 AWS IoT Greengrass할 수 있습니다. 로컬 구성 요소를 완료하면 구성 요소 레시피와 아티팩트를 사용하여 AWS 클라우드의 AWS IoT Greengrass 서비스에서 해당 구성 요소를 생성한 다음 모든 Greengrass 코어 디바이스에 배포할 수 있습니다. 구성 요소에 대한 자세한 내용은 [AWS IoT Greengrass 구성 요소 개발](develop-greengrass-components.md)를 참조하세요.

이 섹션에서는 코어 디바이스에서 로컬로 기본 Hello World 구성 요소를 생성하고 실행하는 방법을 알아봅니다.

**디바이스에서 Hello World 구성 요소를 개발하는 방법**

1. <a name="create-component-recipes-artifacts-folder-step"></a>레시피 및 아티팩트의 하위 폴더로 구성 요소의 폴더를 생성합니다. Greengrass 코어 디바이스에서 다음 명령을 실행하여 이러한 폴더를 생성하고 구성 요소 폴더로 변경합니다. 로컬 개발에 사용할 폴더 경로로 *\$1/greengrassv2* 또는 *%USERPROFILE%\$1greengrassv2*를 바꿉니다.

------
#### [ Linux or Unix ]

   ```
   mkdir -p ~/greengrassv2/{recipes,artifacts}
   cd ~/greengrassv2
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   mkdir %USERPROFILE%\greengrassv2\\recipes, %USERPROFILE%\greengrassv2\\artifacts
   cd %USERPROFILE%\greengrassv2
   ```

------
#### [ PowerShell ]

   ```
   mkdir ~/greengrassv2/recipes, ~/greengrassv2/artifacts
   cd ~/greengrassv2
   ```

------

1. <a name="create-component-recipe-file-step"></a>텍스트 편집기를 사용하여 구성 요소의 메타데이터, 파라미터, 종속성, 수명 주기 및 플랫폼 기능이 정의되는 레시피 파일을 생성합니다. 레시피에 반영되는 구성 요소 버전을 식별할 수 있도록 레시피 파일 이름에 구성 요소 버전을 포함합니다. 레시피에 YAML 또는 JSON 형식을 선택할 수 있습니다.

   <a name="nano-command-intro"></a>예를 들어 Linux 기반 시스템에서 다음 명령을 실행하면 GNU nano를 사용하여 파일을 생성할 수 있습니다.

------
#### [ JSON ]

   ```
   nano recipes/com.example.HelloWorld-1.0.0.json
   ```

------
#### [ YAML ]

   ```
   nano recipes/com.example.HelloWorld-1.0.0.yaml
   ```

------
**참고**  
<a name="semver-para"></a>AWS IoT Greengrass 는 구성 요소에 의미 체계 버전을 사용합니다. *시맨틱 버전은 메이저*.*마이너*.*패치* 번호 시스템을 따릅니다. 예를 들어 `1.0.0` 버전은 구성 요소의 첫 번째 주요 릴리스를 나타냅니다. 자세한 내용은 [의미 체계 버전 사양](https://semver.org/)을 참조하세요.

1. 파일에 다음 레시피를 붙여 넣습니다.

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.HelloWorld",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "My first AWS IoT Greengrass component.",
     "ComponentPublisher": "Amazon",
     "ComponentConfiguration": {
       "DefaultConfiguration": {
         "Message": "world"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "linux"
         },
         "Lifecycle": {
           "run": "python3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
         }
       },
       {
         "Platform": {
           "os": "windows"
         },
         "Lifecycle": {
           "run": "py -3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
         }
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.HelloWorld
   ComponentVersion: '1.0.0'
   ComponentDescription: My first AWS IoT Greengrass component.
   ComponentPublisher: Amazon
   ComponentConfiguration:
     DefaultConfiguration:
       Message: world
   Manifests:
     - Platform:
         os: linux
       Lifecycle:
         run: |
           python3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
     - Platform:
         os: windows
       Lifecycle:
         run: |
           py -3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
   ```

------

   이 레시피의 `ComponentConfiguration` 섹션에서는 기본값이 `world`인 파라미터(`Message`)가 정의합니다. `Manifests` 섹션에서는 플랫폼에 대한 수명 주기 지침과 아티팩트 세트인 *매니페스트*가 정의합니다. 예를 들어 여러 매니페스트를 정의하여 다양한 플랫폼에 상이한 설치 지침을 지정할 수 있습니다. 매니페스트의 `Lifecycle` 섹션에서는 `Message` 파라미터 값을 인수로 사용하여 Hello World 스크립트가 실행되도록 Greengrass 코어 디바이스에 지시합니다.

1. 다음 명령을 실행하여 구성 요소 아티팩트의 폴더를 생성합니다.

------
#### [ Linux or Unix ]

   ```
   mkdir -p artifacts/com.example.HelloWorld/1.0.0
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   mkdir artifacts\com.example.HelloWorld\1.0.0
   ```

------
#### [ PowerShell ]

   ```
   mkdir artifacts\com.example.HelloWorld\1.0.0
   ```

------
**중요**  <a name="local-artifact-folder-name-requirements"></a>
아티팩트 폴더 경로에는 다음 형식을 사용해야 합니다. 레시피에서 지정하는 구성 요소 이름과 버전을 포함합니다.  

   ```
   artifacts/componentName/componentVersion/
   ```

1. 텍스트 편집기를 사용하여 Hello World 구성 요소에 대한 Python 스크립트 아티팩트 파일을 생성합니다.

   <a name="nano-command-intro"></a>예를 들어 Linux 기반 시스템에서 다음 명령을 실행하면 GNU nano를 사용하여 파일을 생성할 수 있습니다.

   ```
   nano artifacts/com.example.HelloWorld/1.0.0/hello_world.py
   ```

   다음 Python 스트립트를 복사하여 파일에 붙여 넣습니다.

   ```
   import sys
   
   message = "Hello, %s!" % sys.argv[1]
   
   # Print the message to stdout, which Greengrass saves in a log file.
   print(message)
   ```

1. 로컬 AWS IoT Greengrass CLI를 사용하여 Greengrass 코어 디바이스의 구성 요소를 관리합니다.

   다음 명령을 실행하여 AWS IoT Greengrass 코어에 구성 요소를 배포합니다. `/greengrass/v2` 또는 *C:\$1greengrass\$1v2*를 AWS IoT Greengrass V2 루트 폴더로 바꾸고*, \$1/greengrassv2* 또는 *%USERPROFILE%\$1greengrassv2*를 구성 요소 개발 폴더로 바꿉니다.

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli deployment create \
     --recipeDir ~/greengrassv2/recipes \
     --artifactDir ~/greengrassv2/artifacts \
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create ^
     --recipeDir %USERPROFILE%\greengrassv2\recipes ^
     --artifactDir %USERPROFILE%\greengrassv2\artifacts ^
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create `
     --recipeDir ~/greengrassv2/recipes `
     --artifactDir ~/greengrassv2/artifacts `
     --merge "com.example.HelloWorld=1.0.0"
   ```

------

   이 명령에서는 `recipes`의 레시피가 사용되고 `artifacts`의 Python 스크립트가 사용되는 구성 요소가 추가됩니다. `--merge` 옵션에서는 지정하는 구성 요소와 버전이 추가 또는 업데이트됩니다.

1.  AWS IoT Greengrass 코어 소프트웨어는 구성 요소 프로세스의 stdout을 `logs` 폴더의 로그 파일에 저장합니다. 다음 명령을 실행하여 Hello World 구성 요소가 실행되고 메시지가 인쇄되는지 확인합니다.

------
#### [ Linux or Unix ]

   ```
   sudo tail -f /greengrass/v2/logs/com.example.HelloWorld.log
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   type C:\greengrass\v2\logs\com.example.HelloWorld.log
   ```

   <a name="windows-cmd-type-observe-logs"></a>`type` 명령에서는 파일의 내용이 터미널이 기록됩니다. 이 명령을 여러 번 실행하여 파일의 변경 사항을 관찰합니다.

------
#### [ PowerShell ]

   ```
   gc C:\greengrass\v2\logs\com.example.HelloWorld.log -Tail 10 -Wait
   ```

------

   다음 예제와 비슷한 메시지가 표시되어야 합니다.

   ```
   Hello, world!
   ```
**참고**  
파일이 없으면 로컬 배포가 아직 완료되지 않았을 수 있습니다. 15초 이내에 파일이 존재하지 않으면 배포에 실패했을 수 있습니다. 예를 들어 레시피가 유효하지 않은 경우에 실패가 발생할 수 있습니다. 다음 명령을 실행하여 AWS IoT Greengrass 코어 로그 파일을 확인합니다. 이 파일에는 Greengrass 코어 디바이스의 배포 서비스의 로그가 포함되어 있습니다.  

   ```
   sudo tail -f /greengrass/v2/logs/greengrass.log
   ```

   ```
   type C:\greengrass\v2\logs\greengrass.log
   ```
<a name="windows-cmd-type-observe-logs"></a>`type` 명령에서는 파일의 내용이 터미널이 기록됩니다. 이 명령을 여러 번 실행하여 파일의 변경 사항을 관찰합니다.

   ```
   gc C:\greengrass\v2\logs\greengrass.log -Tail 10 -Wait
   ```

1. 로컬 구성 요소를 수정하여 코드를 반복하고 테스트합니다. 텍스트 편집기`hello_world.py`에서를 열고 4행에 다음 코드를 추가하여 AWS IoT Greengrass 코어가 로깅하는 메시지를 편집합니다.

   ```
   message += " Greetings from your first Greengrass component."
   ```

   이제 `hello_world.py` 스크립트에 다음 내용이 있어야 합니다.

   ```
   import sys
   
   message = "Hello, %s!" % sys.argv[1]
   message += " Greetings from your first Greengrass component."
   
   # Print the message to stdout, which Greengrass saves in a log file.
   print(message)
   ```

1. 다음 명령을 실행하여 변경 사항으로 구성 요소를 업데이트합니다.

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli deployment create \
     --recipeDir ~/greengrassv2/recipes \
     --artifactDir ~/greengrassv2/artifacts \
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create ^
     --recipeDir %USERPROFILE%\greengrassv2\recipes ^
     --artifactDir %USERPROFILE%\greengrassv2\artifacts ^
     --merge "com.example.HelloWorld=1.0.0"
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create `
     --recipeDir ~/greengrassv2/recipes `
     --artifactDir ~/greengrassv2/artifacts `
     --merge "com.example.HelloWorld=1.0.0"
   ```

------

   이 명령에서는 최신 Hello World 아티팩트로 `com.example.HelloWorld` 구성 요소가 업데이트됩니다.

1. 다음 명령을 실행하여 구성 요소를 다시 시작합니다. 구성 요소를 다시 시작하면 최신 변경 사항이 코어 디바이스에서 사용됩니다.

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli component restart \
     --names "com.example.HelloWorld"
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli component restart ^
     --names "com.example.HelloWorld"
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli component restart `
     --names "com.example.HelloWorld"
   ```

------

1. 로그를 다시 확인하여 Hello World 구성 요소에서 새 메시지가 인쇄되는지 확인합니다.

------
#### [ Linux or Unix ]

   ```
   sudo tail -f /greengrass/v2/logs/com.example.HelloWorld.log
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   type C:\greengrass\v2\logs\com.example.HelloWorld.log
   ```

   <a name="windows-cmd-type-observe-logs"></a>`type` 명령에서는 파일의 내용이 터미널이 기록됩니다. 이 명령을 여러 번 실행하여 파일의 변경 사항을 관찰합니다.

------
#### [ PowerShell ]

   ```
   gc C:\greengrass\v2\logs\com.example.HelloWorld.log -Tail 10 -Wait
   ```

------

   다음 예제와 비슷한 메시지가 표시되어야 합니다.

   ```
   Hello, world! Greetings from your first Greengrass component.
   ```

1. 구성 요소의 구성 파라미터를 업데이트하여 상이한 구성을 테스트할 수 있습니다. 구성 요소를 배포할 때 코어 디바이스에서 구성 요소의 구성이 수정되는 방법이 정의되는 *구성 업데이트 *를 지정할 수 있습니다. 기본값으로 재설정할 구성 값과 코어 디바이스에 병합할 새 구성 값을 지정할 수 있습니다. 자세한 내용은 [구성 요소 구성 업데이트](update-component-configurations.md) 단원을 참조하십시오.

   해결 방법:

   1. 텍스트 편집기를 사용하여 구성 업데이트가 포함되는 `hello-world-config-update.json`이라는 파일을 생성합니다.

      <a name="nano-command-intro"></a>예를 들어 Linux 기반 시스템에서 다음 명령을 실행하면 GNU nano를 사용하여 파일을 생성할 수 있습니다.

      ```
      nano hello-world-config-update.json
      ```

   1. 다음 JSON 객체를 복사하여 파일에 붙여 넣습니다. 이 JSON 객체에서는 값 `friend`가 `Message` 파라미터에 병합되어 값이 업데이트되는 구성 업데이트가 정의됩니다. 이 구성 업데이트에서는 재설정할 값이 지정되지 않습니다. 병합 업데이트를 통해 기존 값이 대체되므로 `Message` 파라미터를 재설정할 필요가 없습니다.

      ```
      {
        "com.example.HelloWorld": {
          "MERGE": {
            "Message": "friend"
          }
        }
      }
      ```

   1. 다음 명령을 실행하여 구성 업데이트를 Hello World 구성 요소에 배포합니다.

------
#### [ Linux or Unix ]

      ```
      sudo /greengrass/v2/bin/greengrass-cli deployment create \
        --merge "com.example.HelloWorld=1.0.0" \
        --update-config hello-world-config-update.json
      ```

------
#### [ Windows Command Prompt (CMD) ]

      ```
      C:\greengrass\v2\bin\greengrass-cli deployment create ^
        --merge "com.example.HelloWorld=1.0.0" ^
        --update-config hello-world-config-update.json
      ```

------
#### [ PowerShell ]

      ```
      C:\greengrass\v2\bin\greengrass-cli deployment create `
        --merge "com.example.HelloWorld=1.0.0" `
        --update-config hello-world-config-update.json
      ```

------

   1. 로그를 다시 확인하여 Hello World 구성 요소에서 새 메시지가 출력되는지 확인합니다.

------
#### [ Linux or Unix ]

      ```
      sudo tail -f /greengrass/v2/logs/com.example.HelloWorld.log
      ```

------
#### [ Windows Command Prompt (CMD) ]

      ```
      type C:\greengrass\v2\logs\com.example.HelloWorld.log
      ```

      <a name="windows-cmd-type-observe-logs"></a>`type` 명령에서는 파일의 내용이 터미널이 기록됩니다. 이 명령을 여러 번 실행하여 파일의 변경 사항을 관찰합니다.

------
#### [ PowerShell ]

      ```
      gc C:\greengrass\v2\logs\com.example.HelloWorld.log -Tail 10 -Wait
      ```

------

      다음 예제와 비슷한 메시지가 표시되어야 합니다.

      ```
      Hello, friend! Greetings from your first Greengrass component.
      ```

1. 구성 요소는 테스트를 마치면 코어 디바이스에서 제거합니다. 다음 명령을 실행합니다.

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli deployment create --remove="com.example.HelloWorld"
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create --remove="com.example.HelloWorld"
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli deployment create --remove="com.example.HelloWorld"
   ```

------
**중요**  
구성 요소를 AWS IoT Greengrass에 업로드한 후 코어 디바이스에 다시 배포하려면 이 단계가 필요합니다. 그렇지 않으면 로컬 배포에서 다른 구성 요소 버전이 지정되므로 버전 호환성 오류로 배포가 실패합니다.

   다음 명령을 실행하고 디바이스의 `com.example.HelloWorld` 구성 요소 목록에 구성 요소가 나타나지 않는지 확인합니다.

------
#### [ Linux or Unix ]

   ```
   sudo /greengrass/v2/bin/greengrass-cli component list
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   C:\greengrass\v2\bin\greengrass-cli component list
   ```

------
#### [ PowerShell ]

   ```
   C:\greengrass\v2\bin\greengrass-cli component list
   ```

------

Hello World 구성 요소가 완료되었으며 이제 AWS IoT Greengrass 클라우드 서비스에 업로드할 수 있습니다. 그런 다음에 구성 요소를 다른 코어 디바이스에 배포할 수 있습니다.