本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
執行 Docker 容器
您可以將 AWS IoT Greengrass 元件設定為從存放在下列位置的映像執行 Docker 容器:
在您的自訂元件中,包含 Docker 映像 URI 做為擷取映像並在核心裝置上執行的成品。對於 Amazon ECR 和 Docker Hub 映像,您可以使用 Docker 應用程式管理員元件來下載映像並管理私有 Amazon ECR 儲存庫的登入資料。
要求
若要在元件中執行 Docker 容器,您需要下列項目:
-
Greengrass 核心裝置。如果您沒有帳戶,請參閱 教學課程:開始使用 AWS IoT Greengrass V2。
-
Docker 引擎 1.9.1 或更新版本安裝在 Greengrass 核心裝置上。最高 和 29.6.0 的版本,例如 20.10、24.0、25.0 和 27.5,可使用 AWS IoT Greengrass 核心軟體。您必須先直接在核心裝置上安裝 Docker,才能部署執行 Docker 容器的元件。
您也可以設定核心裝置,以在元件安裝時安裝 Docker Engine。例如,下列安裝指令碼會在載入 Docker 映像之前安裝 Docker 引擎。此安裝指令碼適用於 Debian 型 Linux 發行版本,例如 Ubuntu。如果您設定 元件使用此命令安裝 Docker Engine,您可能需要在生命週期指令碼true中RequiresPrivilege將 設定為 ,才能執行安裝和docker命令。如需詳細資訊,請參閱AWS IoT Greengrass 元件配方參考。
apt-get install docker-ce docker-ce-cli containerd.io && docker load -i {artifacts:path}/hello-world.tar
-
執行 Docker 容器元件的系統使用者必須具有根或管理員許可,或者您必須將 Docker 設定為以非根或非註冊使用者身分執行。
- Linux or Unix
-
若要將 ggc_user或您用來執行 Docker 容器元件的非根使用者新增至 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 Core 軟體設定為使用網路代理,則必須將 Docker 設定為使用相同的代理伺服器。
除了這些要求之外,如果適用於您的環境,您還必須符合下列要求:
-
若要使用 Docker Compose 建立和啟動 Docker 容器,請在 Greengrass 核心裝置上安裝 Docker Compose,並將 Docker Compose 檔案上傳至 S3 儲存貯體。您必須將 Compose 檔案存放在與 元件相同的 S3 AWS 帳戶 AWS 區域 儲存貯體中。如需在自訂元件中使用 docker-compose up命令的範例,請參閱 從 Amazon ECR 或 Docker Hub 中的公有映像執行 Docker 容器。
-
如果您在網路代理 AWS IoT Greengrass 後方執行 ,請將 Docker 協助程式設定為使用代理伺服器。
-
如果您的 Docker 映像存放在 Amazon ECR 或 Docker Hub 中,請在 Docker 容器元件中包含 Docker 元件管理員元件做為相依性。您必須先在核心裝置上啟動 Docker 協助程式,才能部署元件。
此外,請包含影像 URIs做為元件成品。映像 URIs 的格式必須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 容器元件中包含字符交換服務元件做為相依性。此外,Greengrass 裝置角色必須允許 ecr:GetAuthorizationToken、 ecr:BatchGetImage和 ecr:GetDownloadUrlForLayer動作,如下列範例 IAM 政策所示。
- JSON
-
-
{
"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 儲存貯體中,Greengrass 裝置角色必須允許 s3:GetObject許可,以允許核心裝置將映像下載為元件成品,如下列範例 IAM 政策所示。
- JSON
-
-
{
"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 容器
-
建立 Docker Compose 檔案並將其上傳至 Amazon S3 儲存貯體。確定 Greengrass 裝置角色允許 s3:GetObject 許可,讓裝置存取 Compose 檔案。以下範例中顯示的 Compose 檔案範例包括來自 Amazon ECR 的 Amazon CloudWatch Agent 映像和來自 Docker Hub 的 MySQL 映像。
version: "3"
services:
cloudwatchagent:
image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"
mysql:
image: "mysql:8.0"
-
在 AWS IoT Greengrass 核心裝置上建立自訂元件。下列範例中顯示的範例配方具有下列屬性:
-
Docker 應用程式管理員元件做為相依性。此元件可讓 從公 AWS IoT Greengrass 有 Amazon ECR 和 Docker Hub 儲存庫下載映像。
-
元件成品,指定公有 Amazon ECR 儲存庫中的 Docker 映像。
-
元件成品,指定公有 Docker Hub 儲存庫中的 Docker 映像。
-
元件成品,指定 Docker Compose 檔案,其中包含您要執行之 Docker 映像的容器。
-
生命週期執行指令碼,使用 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 容器時指定其他選項。如需詳細資訊,請參閱下列內容:
-
測試元件以驗證其是否如預期般運作。
您必須先安裝和啟動 Docker 協助程式,才能部署元件。
在本機部署元件之後,您可以執行 Docker 容器 ls 命令,以驗證您的容器是否執行。
docker container ls
-
當元件就緒時,將元件上傳至 AWS IoT Greengrass 以部署至其他核心裝置。如需詳細資訊,請參閱發佈元件以部署到您的核心裝置。
從 Amazon ECR 中的私有映像執行 Docker 容器
本節說明如何建立自訂元件,從存放在 Amazon ECR 中私有儲存庫的 Docker 映像執行 Docker 容器。
執行 Docker 容器
-
在 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 容器時指定其他選項。如需詳細資訊,請參閱下列內容:
-
測試元件以驗證其是否如預期般運作。
您必須先安裝和啟動 Docker 協助程式,才能部署元件。
在本機部署元件之後,您可以執行 Docker 容器 ls 命令,以驗證您的容器是否執行。
docker container ls
-
將元件上傳至 AWS IoT Greengrass 以部署至其他核心裝置。如需詳細資訊,請參閱發佈元件以部署到您的核心裝置。
從 Amazon S3 中的映像執行 Docker 容器
本節說明如何從存放在 Amazon S3 的 Docker 映像在元件中執行 Docker 容器。
從 Amazon S3 中的映像在元件中執行 Docker 容器
-
執行 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
-
在 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"
}
}
}
]
}
- 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 容器時指定其他選項。如需詳細資訊,請參閱下列內容:
-
測試元件以驗證其是否如預期般運作。
在本機部署元件之後,您可以執行 Docker 容器 ls 命令,以驗證您的容器是否執行。
docker container ls
-
當元件就緒時,將 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 容器元件中使用程序間通訊
您可以使用 中的 Greengrass 處理程序間通訊 (IPC) 程式庫 AWS IoT Device SDK 或 AWS IoT Greengrass 元件 SDK 來與 Greengrass 核、其他 Greengrass 元件和 進行通訊 AWS IoT Core。如需詳細資訊,請參閱使用 AWS IoT Device SDK 與 Greengrass 核、其他元件和 通訊 AWS IoT Core。
若要在 Docker 容器元件中使用 IPC,您必須使用下列參數執行 Docker 容器:
-
在容器中掛載 IPC 通訊端。Greengrass 核提供AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT環境變數中的 IPC 通訊端檔案路徑。
-
將 SVCUID和 AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT環境變數設定為 Greengrass 核提供給元件的值。您的元件使用這些環境變數來驗證與 Greengrass 核的連線。
範例範例配方:將 MQTT 訊息發佈至 AWS IoT Core (Python)
下列配方定義發佈 MQTT 訊息的 Docker 容器元件範例 AWS IoT Core。此配方具有下列屬性:
- 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 容器元件 (Linux) 中使用 AWS 登入資料
您可以使用字符交換服務元件與 Greengrass 元件中的 AWS 服務互動。此元件會使用本機容器伺服器,從核心裝置的字符交換角色提供 AWS 登入資料。如需詳細資訊,請參閱與 AWS 服務互動。
若要在 Docker 容器元件中使用字符交換服務的 AWS 憑證,您必須使用下列參數執行 Docker 容器:
-
使用 --network=host引數提供主機網路的存取權。此選項可讓 Docker 容器連線至本機字符交換服務,以擷取 AWS 憑證。此引數僅適用於適用於 Linux 的 Docker。
此選項可讓容器存取主機上的所有本機網路介面,因此此選項比沒有主機網路存取權的情況下執行 Docker 容器更不安全。當您開發和執行使用此選項的 Docker 容器元件時,請考慮這一點。如需詳細資訊,請參閱 Docker 文件中的網路:主機。
-
將 AWS_CONTAINER_CREDENTIALS_FULL_URI和 AWS_CONTAINER_AUTHORIZATION_TOKEN環境變數設定為 Greengrass 核提供給 components 的值。 AWS SDKs使用這些環境變數來擷取 AWS 登入資料。
範例範例配方:列出 Docker 容器元件中的 S3 儲存貯體 (Python)
下列配方會定義範例 Docker 容器元件,列出 中的 S3 儲存貯體 AWS 帳戶。此配方具有下列屬性:
-
做為相依性的字符交換服務元件。此相依性可讓 元件擷取 AWS 登入資料,以與其他 AWS 服務互動。
-
元件成品,指定 Docker 影像做為 Amazon S3 中的 tar 封存。
-
生命週期安裝指令碼,可從 TAR 封存檔載入 Docker 映像。
-
從映像執行 Docker 容器的生命週期執行指令碼。Docker run 命令具有下列引數:
- 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 核心裝置上的資料串流。
若要在 Docker 容器元件中使用串流管理員 SDK,您必須使用下列參數執行 Docker 容器:
-
使用 --network=host引數提供主機網路的存取權。此選項可讓 Docker 容器透過本機 TLS 連線與串流管理員元件互動。此引數僅適用於適用於 Linux 的 Docker
此選項可讓容器存取主機上的所有本機網路介面,因此此選項比沒有主機網路存取權的情況下執行 Docker 容器更不安全。當您開發和執行使用此選項的 Docker 容器元件時,請考慮這一點。如需詳細資訊,請參閱 Docker 文件中的網路:主機。
-
如果您將串流管理員元件設定為需要身分驗證,這是預設行為,請將AWS_CONTAINER_CREDENTIALS_FULL_URI環境變數設定為 Greengrass 核提供給元件的值。如需詳細資訊,請參閱串流管理員組態。
-
如果您將串流管理員元件設定為使用非預設連接埠,請使用程序間通訊 (IPC) 從串流管理員元件組態取得連接埠。您必須使用其他選項來執行 Docker 容器,才能使用 IPC。如需詳細資訊,請參閱下列內容:
範例範例配方:將檔案串流到 Docker 容器元件 (Python) 中的 S3 儲存貯體
下列配方定義範例 Docker 容器元件,可建立檔案並將其串流至 S3 儲存貯體。此配方具有下列屬性:
-
串流管理員元件做為相依性。此相依性可讓 元件使用串流管理員 SDK 與串流管理員元件互動。
-
元件成品,指定 Docker 影像做為 Amazon S3 中的 TAR 封存。
-
生命週期安裝指令碼,可從 TAR 封存檔載入 Docker 映像。
-
從映像執行 Docker 容器的生命週期執行指令碼。Docker run 命令具有下列引數:
-
--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