Docker 컨테이너 실행 - AWS IoT Greengrass

Docker 컨테이너 실행

다음 위치에 저장된 이미지에서 Docker 컨테이너를 실행하도록 AWS IoT Greengrass 구성 요소를 구성할 수 있습니다.

  • Amazon Elastic Container Registry(Amazon ECR)의 퍼블릭 및 프라이빗 이미지 리포지토리

  • 퍼블릭 Docker Hub 리포지토리

  • 퍼블릭 Docker 신뢰할 수 있는 레지스트리

  • S3 버킷

사용자 지정 컴포넌트에서 이미지를 검색하고 코어 디바이스에서 실행할 수 있도록 Docker 이미지 URI를 아티팩트로 포함하세요. Amazon ECR 및 Docker Hub 이미지의 경우 Docker 애플리케이션 관리자 구성 요소를 사용하여 이미지를 다운로드하고 프라이빗 Amazon ECR 리포지토리에 대한 자격 증명을 관리할 수 있습니다.

요구 사항

구성 요소에서 Docker 컨테이너를 실행하려면 다음이 필요합니다.

  • Greengrass 코어 디바이스. 계정이 없는 경우 자습서: AWS IoT Greengrass V2 시작하기 단원을 참조하세요.

  • Greengrass 코어 디바이스에 Docker Engine 1.9.1 이상이 설치되어 있어야 합니다. 20.10 버전은 AWS IoT Greengrass 코어 소프트웨어와 함께 작동하는 것으로 확인된 최신 버전입니다. Docker 컨테이너를 실행하는 구성 요소를 배포하기 전에 코어 디바이스에 직접 Docker를 설치해야 합니다.

    작은 정보

    구성 요소가 설치될 때 코어 디바이스가 Docker Engine을 설치하도록 구성할 수도 있습니다. 예를 들어 다음 설치 스크립트는 Docker 이미지를 로드하기 전에 Docker Engine을 설치합니다. 이 설치 스크립트는 Ubuntu와 같은 Debian 기반 Linux 배포에서 작동합니다. 이 명령으로 Docker Engine을 설치하도록 구성하는 경우 설치 및 docker 명령을 실행하려면 수명 주기 스크립트에서 RequiresPrivilegetrue로 설정해야 할 수 있습니다. 자세한 내용은 AWS IoT Greengrass 구성 요소 레시피 참조 단원을 참조하십시오.

    apt-get install docker-ce docker-ce-cli containerd.io && docker load -i {artifacts:path}/hello-world.tar
  • Docker 컨테이너 구성 요소를 실행하는 시스템 사용자에게 루트 또는 관리자 권한이 있거나 루트 또는 관리자가 아닌 사용자로 실행하도록 Docker를 구성해야 합니다.

    • Linux 디바이스에서는 docker 그룹에 사용자를 추가하여 sudo 없이 docker 명령을 직접적으로 호출할 수 있습니다.

    • Windows 디바이스에서는 docker-users 그룹에 사용자를 추가하여 관리자 권한 없이 docker 명령을 직접적으로 호출할 수 있습니다.

    Linux or Unix

    Docker 컨테이너 구성 요소를 실행하는 데 사용하는 ggc_user 또는 루트 사용자가 아닌 사용자를 docker 그룹에 추가하려면 다음 명령을 실행합니다.

    sudo usermod -aG docker ggc_user

    자세한 내용은 루트 사용자가 아닌 사용자로 Docker 관리를 참조하세요.

    Windows Command Prompt (CMD)

    ggc_user 또는 Docker 컨테이너 구성 요소를 실행하는 데 사용하는 사용자를 docker-users 그룹에 추가하려면 관리자로 다음 명령을 실행합니다.

    net localgroup docker-users ggc_user /add
    Windows PowerShell

    ggc_user 또는 Docker 컨테이너 구성 요소를 실행하는 데 사용하는 사용자를 docker-users 그룹에 추가하려면 관리자로 다음 명령을 실행합니다.

    Add-LocalGroupMember -Group docker-users -Member ggc_user
  • Docker 컨테이너에 볼륨으로 탑재된 Docker 컨테이너 구성 요소에서 액세스하는 파일입니다.

  • 네트워크 프록시를 사용하도록 AWS IoT Greengrass 코어 소프트웨어를 구성하는 경우에는 동일한 프록시 서버를 사용하도록 Docker를 구성해야 합니다.

이러한 요구 사항 외에도 사용자 환경에 적용되는 경우 다음과 같은 요구 사항도 충족해야 합니다.

  • Docker Compose를 사용하여 Docker 컨테이너를 생성하고 시작하려면 Greengrass 코어 디바이스에 Docker Compose를 설치하고 Docker Compose 파일을 S3 버킷에 업로드하세요. Compose 파일은 구성 요소와 동일한 AWS 계정 및 AWS 리전의 S3 버킷에 저장해야 합니다. 사용자 지정 컴포넌트에서 docker-compose up 명령을 사용하는 예제는 Amazon ECR 또는 Docker Hub의 퍼블릭 이미지에서 Docker 컨테이너 실행 섹션을 참조하세요.

  • 네트워크 프록시 뒤에서 AWS IoT Greengrass를 실행하는 경우 프록시 서버를 사용하도록 Docker 대몬을 구성하세요.https://docs.docker.com/network/proxy/

  • Docker 이미지가 Amazon ECR 또는 Docker Hub에 저장되어 있는 경우 Docker 컨테이너 구성 요소에 Docker 구성 요소 관리자 구성 요소를 종속성으로 포함합니다. 구성 요소를 배포하기 전에 코어 디바이스에서 Docker 대몬을 시작해야 합니다.

    또한 이미지 URI를 구성 요소 아티팩트로 포함하세요. 이미지 URI는 다음 예제와 같이 docker:registry/image[:tag|@digest] 형식이어야 합니다.

    • 프라이빗 Amazon ECR 이미지: docker:account-id.dkr.ecr.region.amazonaws.com/repository/image[:tag|@digest]

    • 퍼블릭 Amazon ECR 이미지: docker:public.ecr.aws/repository/image[:tag|@digest]

    • 퍼블릭 Docker Hub 이미지: docker:name[:tag|@digest]

    퍼블릭 리포지토리에 저장된 이미지에서 Docker 컨테이너를 실행하는 방법에 대한 자세한 내용은 Amazon ECR 또는 Docker Hub의 퍼블릭 이미지에서 Docker 컨테이너 실행 섹션을 참조하세요.

  • Docker 이미지가 Amazon ECR 프라이빗 리포지토리에 저장되어 있는 경우 토큰 교환 서비스 구성 요소를 Docker 컨테이너 구성 요소에 종속성으로 포함해야 합니다. 또한 다음 예제 IAM 정책에 표시된 대로 Greengrass 디바이스 역할에서 ecr:GetAuthorizationToken, ecr:BatchGetImage, ecr:GetDownloadUrlForLayer 작업을 허용해야 합니다.

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Resource": [ "*" ], "Effect": "Allow" } ] }

    Amazon ECR 프라이빗 리포지토리에 저장된 이미지에서 Docker 컨테이너를 실행하는 방법에 대한 자세한 내용은 Amazon ECR의 프라이빗 이미지에서 Docker 컨테이너 실행 섹션을 참조하세요.

  • Amazon ECR 프라이빗 리포지토리에 저장된 Docker 이미지를 사용하려면 프라이빗 리포지토리가 코어 디바이스와 동일한 AWS 리전에 있어야 합니다.

  • Docker 이미지 또는 Compose 파일이 S3 버킷에 저장되어 있는 경우 다음 예제 IAM 정책에 표시된 대로 Greengrass 디바이스 역할에서 코어 디바이스가 이미지를 구성 요소 아티팩트로 다운로드할 수 있도록 허용하는 s3:GetObject 권한을 허용해야 합니다.

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Resource": [ "*" ], "Effect": "Allow" } ] }

    Amazon S3에 저장된 이미지에서 Docker 컨테이너를 실행하는 방법에 대한 자세한 내용은 Amazon S3의 이미지에서 Docker 컨테이너 실행 섹션을 참조하세요.

  • Docker 컨테이너 구성 요소에서 프로세스 간 통신(IPC), AWS 자격 증명 또는 스트림 관리자를 사용하려면 Docker 컨테이너를 실행할 때 추가 옵션을 지정해야 합니다. 자세한 내용은 다음 자료를 참조하세요.

Amazon ECR 또는 Docker Hub의 퍼블릭 이미지에서 Docker 컨테이너 실행

이 섹션에서는 Docker Compose를 사용하여 Amazon ECR 및 Docker Hub에 저장된 Docker 이미지에서 Docker 컨테이너를 실행하는 사용자 지정 구성 요소를 생성하는 방법을 설명합니다.

Docker Compose를 사용하여 Docker 컨테이너를 실행하려면
  1. Docker Compose 파일을 생성하고 Amazon S3 버킷에 업로드합니다. Greengrass 디바이스 역할이 디바이스에서 Compose 파일에 액세스할 수 있는 s3:GetObject 권한을 허용하는지 확인합니다. 다음 예제에 표시된 Compose 파일 예제에는 Amazon ECR의 Amazon CloudWatch 에이전트 이미지와 Docker Hub의 MySQL 이미지가 포함되어 있습니다.

    version: "3" services: cloudwatchagent: image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" mysql: image: "mysql:8.0"
  2. AWS IoT Greengrass 코어 디바이스에서 사용자 지정 구성 요소를 생성합니다. 다음 예제에 표시된 예제 레시피에는 다음 속성이 있습니다.

    • 종속성으로서의 Docker 애플리케이션 관리자 구성 요소입니다. 이 구성 요소를 사용하면 AWS IoT Greengrass가 퍼블릭 Amazon ECR 및 Docker Hub 리포지토리에서 이미지를 다운로드할 수 있습니다.

    • 퍼블릭 Amazon ECR 리포지토리에서 Docker 이미지를 지정하는 구성 요소 아티팩트입니다.

    • 퍼블릭 Docker Hub 리포지토리에서 Docker 이미지를 지정하는 구성 요소 아티팩트입니다.

    • 실행하려는 Docker 이미지의 컨테이너를 포함하는 Docker Compose 파일을 지정하는 구성 요소 아티팩트입니다.

    • 지정된 이미지에서 컨테이너를 생성하고 시작하기 위해 docker-compose up을 사용하는 수명 주기 실행 스크립트입니다.

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyDockerComposeComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.DockerApplicationManager": { "VersionRequirement": "~2.0.0" } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "run": "docker-compose -f {artifacts:path}/docker-compose.yaml up" }, "Artifacts": [ { "URI": "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" }, { "URI": "docker:mysql:8.0" }, { "URI": "s3://amzn-s3-demo-bucket/folder/docker-compose.yaml" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyDockerComposeComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.' ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.DockerApplicationManager: VersionRequirement: ~2.0.0 Manifests: - Platform: os: all Lifecycle: run: docker-compose -f {artifacts:path}/docker-compose.yaml up Artifacts: - URI: "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" - URI: "docker:mysql:8.0" - URI: "s3://amzn-s3-demo-bucket/folder/docker-compose.yaml"
    참고

    Docker 컨테이너 구성 요소에서 프로세스 간 통신(IPC), AWS 자격 증명 또는 스트림 관리자를 사용하려면 Docker 컨테이너를 실행할 때 추가 옵션을 지정해야 합니다. 자세한 내용은 다음 자료를 참조하세요.

  3. 구성 요소를 테스트하여 예상대로 작동하는지 확인합니다.

    중요

    구성 요소를 배포하기 전에 Docker 대몬을 설치하고 시작해야 합니다.

    구성 요소를 로컬에 배포한 후 docker container ls 명령을 실행하여 컨테이너가 실행되는지 확인할 수 있습니다.

    docker container ls
  4. 구성 요소가 준비되면 구성 요소를 AWS IoT Greengrass에 업로드하여 다른 코어 디바이스에 배포합니다. 자세한 내용은 코어 디바이스에 배포할 구성 요소를 게시하세요. 단원을 참조하십시오.

Amazon ECR의 프라이빗 이미지에서 Docker 컨테이너 실행

이 섹션에서는 Amazon ECR의 프라이빗 리포지토리에 저장된 Docker 이미지에서 Docker 컨테이너를 실행하는 사용자 지정 구성 요소를 만드는 방법을 설명합니다.

Docker 컨테이너를 실행하려면
  1. AWS IoT Greengrass 코어 디바이스에서 사용자 지정 구성 요소를 생성합니다. 다음 속성이 있는 다음 레시피 예제를 사용합니다.

    • 종속성으로서의 Docker 애플리케이션 관리자 구성 요소입니다. 이 구성 요소를 사용하면 AWS IoT Greengrass가 프라이빗 리포지토리에서 이미지를 다운로드하기 위한 자격 증명을 관리할 수 있습니다.

    • 종속성으로서의 토큰 교환 서비스 구성 요소입니다. 이 구성 요소를 사용하면 AWS IoT Greengrass는 AWS 자격 증명을 검색하여 Amazon ECR과 상호 작용할 수 있습니다.

    • 프라이빗 Amazon ECR 리포지토리에서 Docker 이미지를 지정하는 구성 요소 아티팩트입니다.

    • 이미지에서 컨테이너를 생성하고 시작하기 위해 docker run을 사용하는 수명 주기 실행 스크립트입니다.

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyPrivateDockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from a private Amazon ECR image.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.DockerApplicationManager": { "VersionRequirement": "~2.0.0" }, "aws.greengrass.TokenExchangeService": { "VersionRequirement": "~2.0.0" } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "run": "docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]" }, "Artifacts": [ { "URI": "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyPrivateDockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from a private Amazon ECR image.' ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.DockerApplicationManager: VersionRequirement: ~2.0.0 aws.greengrass.TokenExchangeService: VersionRequirement: ~2.0.0 Manifests: - Platform: os: all Lifecycle: run: docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest] Artifacts: - URI: "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]"
    참고

    Docker 컨테이너 구성 요소에서 프로세스 간 통신(IPC), AWS 자격 증명 또는 스트림 관리자를 사용하려면 Docker 컨테이너를 실행할 때 추가 옵션을 지정해야 합니다. 자세한 내용은 다음 자료를 참조하세요.

  2. 구성 요소를 테스트하여 예상대로 작동하는지 확인합니다.

    중요

    구성 요소를 배포하기 전에 Docker 대몬을 설치하고 시작해야 합니다.

    구성 요소를 로컬에 배포한 후 docker container ls 명령을 실행하여 컨테이너가 실행되는지 확인할 수 있습니다.

    docker container ls
  3. 구성 요소를 AWS IoT Greengrass에 업로드하여 다른 코어 디바이스에 배포합니다. 자세한 내용은 코어 디바이스에 배포할 구성 요소를 게시하세요. 단원을 참조하십시오.

Amazon S3의 이미지에서 Docker 컨테이너 실행

이 섹션에서는 Amazon S3에 저장된 Docker 이미지의 구성 요소에서 Docker 컨테이너를 실행하는 방법을 설명합니다.

Amazon S3의 이미지에서 구성 요소에서 Docker 컨테이너를 실행하려면
  1. docker save 명령을 실행하여 Docker 컨테이너의 백업을 생성합니다. 이 백업을 구성 요소 아티팩트로 제공하여 AWS IoT Greengrass에서 컨테이너를 실행합니다. hello-world를 이미지 이름으로 바꾸고 hello-world.tar를 생성할 아카이브 파일 이름으로 바꿉니다.

    docker save hello-world > artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
  2. AWS IoT Greengrass 코어 디바이스에서 사용자 지정 구성 요소를 생성합니다. 다음 속성이 있는 다음 레시피 예제를 사용합니다.

    • 아카이브에서 Docker 이미지를 로드하기 위해 docker load를 사용하는 수명 주기 설치 스크립트입니다.

    • 이미지에서 컨테이너를 생성하고 시작하기 위해 docker run을 사용하는 수명 주기 실행 스크립트입니다. --rm 옵션은 컨테이너가 종료될 때 컨테이너를 정리합니다.

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyS3DockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.", "ComponentPublisher": "Amazon", "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": { "Script": "docker load -i {artifacts:path}/hello-world.tar" }, "run": { "Script": "docker run --rm hello-world" } } } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyS3DockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.' ComponentPublisher: Amazon Manifests: - Platform: os: linux Lifecycle: install: Script: docker load -i {artifacts:path}/hello-world.tar run: Script: docker run --rm hello-world
    참고

    Docker 컨테이너 구성 요소에서 프로세스 간 통신(IPC), AWS 자격 증명 또는 스트림 관리자를 사용하려면 Docker 컨테이너를 실행할 때 추가 옵션을 지정해야 합니다. 자세한 내용은 다음 자료를 참조하세요.

  3. 구성 요소를 테스트하여 예상대로 작동하는지 확인합니다.

    구성 요소를 로컬에 배포한 후 docker container ls 명령을 실행하여 컨테이너가 실행되는지 확인할 수 있습니다.

    docker container ls
  4. 구성 요소가 준비되면 Docker 이미지 아카이브를 S3 버킷에 업로드하고 해당 URI를 구성 요소 레시피에 추가합니다. 그런 다음 구성 요소를 업로드하여 AWS IoT Greengrass를 다른 코어 디바이스에 배포할 수 있습니다. 자세한 내용은 코어 디바이스에 배포할 구성 요소를 게시하세요. 단원을 참조하십시오.

    완료되면 구성 요소 레시피는 다음 예제와 유사하게 보일 것입니다.

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyS3DockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.", "ComponentPublisher": "Amazon", "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": { "Script": "docker load -i {artifacts:path}/hello-world.tar" }, "run": { "Script": "docker run --rm hello-world" } }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyS3DockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.' ComponentPublisher: Amazon Manifests: - Platform: os: linux Lifecycle: install: Script: docker load -i {artifacts:path}/hello-world.tar run: Script: docker run --rm hello-world Artifacts: - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar

Docker 컨테이너 구성 요소에서 프로세스 간 통신 사용

AWS IoT Device SDK의 Greengrass 프로세스 간 통신(IPC) 라이브러리를 사용하여 Greengrass nucleus, 다른 Greengrass 구성 요소, AWS IoT Core와 통신할 수 있습니다. 자세한 내용은 AWS IoT Device SDK를 사용하여 Greengrass nucleus, 기타 구성 요소 및 AWS IoT Core와 통신 단원을 참조하십시오.

Docker 컨테이너 구성 요소에서 IPC를 사용하려면 다음 파라미터를 사용하여 Docker 컨테이너를 실행해야 합니다.

  • 컨테이너에 IPC 소켓을 탑재합니다. Greengrass nucleus는 AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT 환경 변수의 IPC 소켓 파일 경로를 제공합니다.

  • SVCUIDAWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT 환경 변수를 Greengrass nucleus가 구성 요소에 제공하는 값으로 설정합니다. 구성 요소는 이러한 환경 변수를 사용하여 Greengrass nucleus에 대한 연결을 인증합니다.

예제 레시피: MQTT 메시지를 AWS IoT Core(Python)에 게시

다음 레시피는 MQTT 메시지를 AWS IoT Core에 게시하는 예제 Docker 컨테이너 구성 요소를 정의합니다. 이 레시피의 속성은 다음과 같습니다.

  • 구성 요소가 모든 주제에 대해 AWS IoT Core에 MQTT 메시지를 게시할 수 있도록 허용하는 권한 부여 정책(accessControl)입니다. 자세한 내용은 구성 요소에 IPC 작업을 수행할 수 있는 권한 부여AWS IoT Core MQTT IPC 권한 부여를 참조하세요.

  • Amazon S3에서 Docker 이미지를 TAR 아카이브로 지정하는 구성 요소 아티팩트입니다.

  • TAR 아카이브에서 Docker 이미지를 로드하는 수명 주기 설치 스크립트입니다.

  • 이미지에서 Docker 컨테이너를 실행하는 수명 주기 실행 스크립트입니다. Docker 실행 명령에는 다음 인수가 있습니다.

    • -v 인수는 컨테이너에 Greengrass IPC 소켓을 탑재합니다.

    • 처음 두 -e 인수는 Docker 컨테이너에서 필요한 환경 변수를 설정합니다.

    • 추가 -e 인수는 이 예제에서 사용하는 환경 변수를 설정합니다.

    • --rm 인수는 컨테이너가 종료될 때 컨테이너를 정리합니다.

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.python.docker.PublishToIoTCore", "ComponentVersion": "1.0.0", "ComponentDescription": "Uses interprocess communication to publish an MQTT message to IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "topic": "test/topic/java", "message": "Hello, World!", "qos": "1", "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.python.docker.PublishToIoTCore:pubsub:1": { "policyDescription": "Allows access to publish to IoT Core on all topics.", "operations": [ "aws.greengrass#PublishToIoTCore" ], "resources": [ "*" ] } } } } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "install": "docker load -i {artifacts:path}/publish-to-iot-core.tar", "run": "docker run -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e SVCUID -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e MQTT_TOPIC=\"{configuration:/topic}\" -e MQTT_MESSAGE=\"{configuration:/message}\" -e MQTT_QOS=\"{configuration:/qos}\" --rm publish-to-iot-core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar" } ] } ] }
YAML
RecipeFormatVersion: '2020-01-25' ComponentName: com.example.python.docker.PublishToIoTCore ComponentVersion: 1.0.0 ComponentDescription: Uses interprocess communication to publish an MQTT message to IoT Core. ComponentPublisher: Amazon ComponentConfiguration: DefaultConfiguration: topic: 'test/topic/java' message: 'Hello, World!' qos: '1' accessControl: aws.greengrass.ipc.mqttproxy: 'com.example.python.docker.PublishToIoTCore:pubsub:1': policyDescription: Allows access to publish to IoT Core on all topics. operations: - 'aws.greengrass#PublishToIoTCore' resources: - '*' Manifests: - Platform: os: all Lifecycle: install: 'docker load -i {artifacts:path}/publish-to-iot-core.tar' run: | docker run \ -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \ -e SVCUID \ -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \ -e MQTT_TOPIC="{configuration:/topic}" \ -e MQTT_MESSAGE="{configuration:/message}" \ -e MQTT_QOS="{configuration:/qos}" \ --rm publish-to-iot-core Artifacts: - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar

Docker 컨테이너 구성 요소에서 AWS 자격 증명 사용(Linux)

토큰 교환 서비스 구성 요소를 사용하여 Greengrass 구성 요소의 AWS 서비스와 상호 작용할 수 있습니다. 이 구성 요소는 로컬 컨테이너 서버를 사용하여 코어 디바이스의 토큰 교환 역할에서 AWS 자격 증명을 제공합니다. 자세한 내용은 AWS 서비스와 상호 작용 단원을 참조하십시오.

참고

이 섹션의 예제는 Linux 코어 디바이스에서만 작동합니다.

Docker 컨테이너 구성 요소의 토큰 교환 서비스에서 AWS 자격 증명을 사용하려면 다음 파라미터로 Docker 컨테이너를 실행해야 합니다.

  • --network=host 인수를 사용하여 호스트 네트워크에 대한 액세스를 제공합니다. 이 옵션을 사용하면 Docker 컨테이너가 로컬 토큰 교환 서비스에 연결하여 AWS 자격 증명을 검색할 수 있습니다. 이 인수는 Linux용 Docker에서만 작동합니다.

    주의

    이 옵션을 사용하면 컨테이너가 호스트의 모든 로컬 네트워크 인터페이스에 액세스할 수 있으므로 호스트 네트워크에 대한 액세스 권한 없이 Docker 컨테이너를 실행하는 경우보다 안전하지 않습니다. 이 옵션을 사용하는 Docker 컨테이너 구성 요소를 개발하고 실행할 때 이 점을 고려하세요. 자세한 내용은 Docker 설명서에서 네트워크: 호스트를 참조하세요.

  • AWS_CONTAINER_CREDENTIALS_FULL_URIAWS_CONTAINER_AUTHORIZATION_TOKEN 환경 변수를 Greengrass nucleus가 구성 요소에 제공하는 값으로 설정합니다. AWS SDK는 이러한 환경 변수를 사용하여 AWS 자격 증명을 검색합니다.

예제 레시피: Docker 컨테이너 구성 요소에 S3 버킷 나열(Python)

다음 레시피는 AWS 계정에 S3 버킷을 나열하는 예제 Docker 컨테이너 구성 요소를 정의합니다. 이 레시피의 속성은 다음과 같습니다.

  • 종속성으로서의 토큰 교환 서비스 구성 요소입니다. 이 종속성을 통해 구성 요소는 다른 AWS 서비스와 상호 작용하기 위해 AWS 자격 증명을 검색할 수 있습니다.

  • Amazon S3에서 Docker 이미지를 TAR 아카이브로 지정하는 구성 요소 아티팩트입니다.

  • TAR 아카이브에서 Docker 이미지를 로드하는 수명 주기 설치 스크립트입니다.

  • 이미지에서 Docker 컨테이너를 실행하는 수명 주기 실행 스크립트입니다. Docker 실행 명령에는 다음 인수가 있습니다.

    • --network=host 인수는 컨테이너가 토큰 교환 서비스에 연결할 수 있도록 호스트 네트워크에 대한 컨테이너 액세스를 제공합니다.

    • -e 인수는 Docker 컨테이너에 필요한 환경 변수를 설정합니다.

    • --rm 인수는 컨테이너가 종료될 때 컨테이너를 정리합니다.

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.python.docker.ListS3Buckets", "ComponentVersion": "1.0.0", "ComponentDescription": "Uses the token exchange service to lists your S3 buckets.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.TokenExchangeService": { "VersionRequirement": "^2.0.0", "DependencyType": "HARD" } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": "docker load -i {artifacts:path}/list-s3-buckets.tar", "run": "docker run --network=host -e AWS_CONTAINER_AUTHORIZATION_TOKEN -e AWS_CONTAINER_CREDENTIALS_FULL_URI --rm list-s3-buckets" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar" } ] } ] }
YAML
RecipeFormatVersion: '2020-01-25' ComponentName: com.example.python.docker.ListS3Buckets ComponentVersion: 1.0.0 ComponentDescription: Uses the token exchange service to lists your S3 buckets. ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.TokenExchangeService: VersionRequirement: ^2.0.0 DependencyType: HARD Manifests: - Platform: os: linux Lifecycle: install: 'docker load -i {artifacts:path}/list-s3-buckets.tar' run: | docker run \ --network=host \ -e AWS_CONTAINER_AUTHORIZATION_TOKEN \ -e AWS_CONTAINER_CREDENTIALS_FULL_URI \ --rm list-s3-buckets Artifacts: - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar

Docker 컨테이너 구성 요소에서 스트림 관리자 사용(Linux)

스트림 관리자 구성 요소를 사용하여 Greengrass 구성 요소의 데이터 스트림을 관리할 수 있습니다. 이 구성 요소를 사용하면 데이터 스트림을 처리하고 대용량 IoT 데이터를 AWS 클라우드로 전송할 수 있습니다. AWS IoT Greengrass는 스트림 관리자 구성 요소와 상호 작용하는 데 사용하는 스트림 관리자 SDK를 제공합니다. 자세한 내용은 Greengrass 코어 디바이스에서 데이터 스트림 관리 단원을 참조하십시오.

참고

이 섹션의 예제는 Linux 코어 디바이스에서만 작동합니다.

Docker 컨테이너 구성 요소에서 스트림 관리자 SDK를 사용하려면 다음 파라미터를 사용하여 Docker 컨테이너를 실행해야 합니다.

  • --network=host 인수를 사용하여 호스트 네트워크에 대한 액세스를 제공합니다. 이 옵션을 사용하면 Docker 컨테이너가 로컬 TLS 연결을 통해 스트림 관리자 구성 요소와 상호 작용할 수 있습니다. 이 인수는 Linux용 Docker에서만 작동합니다.

    주의

    이 옵션을 사용하면 컨테이너가 호스트의 모든 로컬 네트워크 인터페이스에 액세스할 수 있으므로 호스트 네트워크에 대한 액세스 권한 없이 Docker 컨테이너를 실행하는 경우보다 안전하지 않습니다. 이 옵션을 사용하는 Docker 컨테이너 구성 요소를 개발하고 실행할 때 이 점을 고려하세요. 자세한 내용은 Docker 설명서에서 네트워크: 호스트를 참조하세요.

  • 기본 동작인 인증을 요구하도록 스트림 관리자 구성 요소를 구성하는 경우에는 AWS_CONTAINER_CREDENTIALS_FULL_URI 환경 변수를 Greengrass nucleus가 구성 요소에 제공하는 값으로 설정합니다. 자세한 내용은 스트림 관리자 구성을 참조하세요.

  • 기본 포트가 아닌 포트를 사용하도록 스트림 관리자 구성 요소를 구성하는 경우 프로세스 간 통신(IPC)을 사용하여 스트림 관리자 구성 요소 구성에서 포트를 가져옵니다. IPC를 사용하려면 추가 옵션이 포함된 Docker 컨테이너를 실행해야 합니다. 자세한 내용은 다음 자료를 참조하세요.

예제 레시피: Docker 컨테이너 구성 요소의 S3 버킷으로 파일 스트리밍(Python)

다음 레시피는 파일을 생성하여 S3 버킷으로 스트리밍하는 예제 Docker 컨테이너 컴포넌트를 정의합니다. 이 레시피의 속성은 다음과 같습니다.

  • 종속성으로서의 스트림 관리자 구성 요소. 이러한 종속성을 통해 구성 요소는 스트림 관리자 SDK를 사용하여 스트림 관리자 구성 요소와 상호 작용할 수 있습니다.

  • Amazon S3에서 Docker 이미지를 TAR 아카이브로 지정하는 구성 요소 아티팩트입니다.

  • TAR 아카이브에서 Docker 이미지를 로드하는 수명 주기 설치 스크립트입니다.

  • 이미지에서 Docker 컨테이너를 실행하는 수명 주기 실행 스크립트입니다. Docker 실행 명령에는 다음 인수가 있습니다.

    • --network=host 인수는 컨테이너가 스트림 관리자 구성 요소에 연결할 수 있도록 호스트 네트워크에 대한 컨테이너 액세스를 제공합니다.

    • 첫 번째 -e 인수는 Docker 컨테이너에서 필요한 AWS_CONTAINER_AUTHORIZATION_TOKEN 환경 변수를 설정합니다.

    • 추가 -e 인수는 이 예제에서 사용하는 환경 변수를 설정합니다.

    • -v 인수는 컨테이너에 구성 요소의 작업 폴더를 탑재합니다. 이 예제에서는 작업 폴더에 파일을 생성하고 스트림 관리자를 사용하여 해당 파일을 Amazon S3에 업로드합니다.

    • --rm 인수는 컨테이너가 종료될 때 컨테이너를 정리합니다.

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.python.docker.StreamFileToS3", "ComponentVersion": "1.0.0", "ComponentDescription": "Creates a text file and uses stream manager to stream the file to S3.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.StreamManager": { "VersionRequirement": "^2.0.0", "DependencyType": "HARD" } }, "ComponentConfiguration": { "DefaultConfiguration": { "bucketName": "" } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": "docker load -i {artifacts:path}/stream-file-to-s3.tar", "run": "docker run --network=host -e AWS_CONTAINER_AUTHORIZATION_TOKEN -e BUCKET_NAME=\"{configuration:/bucketName}\" -e WORK_PATH=\"{work:path}\" -v {work:path}:{work:path} --rm stream-file-to-s3" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar" } ] } ] }
YAML
RecipeFormatVersion: '2020-01-25' ComponentName: com.example.python.docker.StreamFileToS3 ComponentVersion: 1.0.0 ComponentDescription: Creates a text file and uses stream manager to stream the file to S3. ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.StreamManager: VersionRequirement: ^2.0.0 DependencyType: HARD ComponentConfiguration: DefaultConfiguration: bucketName: '' Manifests: - Platform: os: linux Lifecycle: install: 'docker load -i {artifacts:path}/stream-file-to-s3.tar' run: | docker run \ --network=host \ -e AWS_CONTAINER_AUTHORIZATION_TOKEN \ -e BUCKET_NAME="{configuration:/bucketName}" \ -e WORK_PATH="{work:path}" \ -v {work:path}:{work:path} \ --rm stream-file-to-s3 Artifacts: - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar