こんにちは。運用開発グループの松田です。
今回は AWS の IoT サービス (AWS IoT Greengrass) を利用して、エッジデバイスに対してリモートでコンテナを配布し実行してみたいと思います。
AWS IoT Greengrass とは
AWS IoT Greengrass とは、IoT デバイスに対してクラウド側の機能を拡張することができるソフトウェアです。
各デバイスに対してコンポーネントという単位で開発したアプリケーションを配布したり、クラウド側からジョブを実行したり、デバイスのデータを収集することなどが可能です。
検証環境構成
今回は Greengrass コンポーネントをエッジデバイスにデプロイして、ECR のプライベートリポジトリから取得したコンテナイメージを docker-compose で実行していきます。
検証環境は以下のようになります。
クラウド側
・AWS IoT Greengrass のコンポーネントとして、コンテナアプリケーションを定義。
・ECR の Private Repository にコンテナイメージを格納。
・S3 にコンテナ起動用の docker-compose.yaml を格納。
エッジデバイス側
・Greengrass, docker, docker-compose をインストール。
・Docker application manager コンポーネントを実行し、ECR プライベートリポジトリからコンテナイメージを 取得。
・各 AWS サービスから必要なファイル (コンポーネント、コンテナイメージ、docker-compose.yaml) を取得。
前提条件
・検証用コンテナイメージ (今回は公式の nginx イメージを利用) は ECR のプライベートリポジトリに Push 済み。
・エッジデバイスに Greengrass, Docker application manager コンポーネント, docker, docker-compose がインストール済み。
環境構築
1. 事前準備
エッジデバイスの IAM Role に対して、S3 と ECR に対するアクセス権限を付与します。
今回は既存の権限に加えて以下の権限を追加しています。
{
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Resource": "arn:aws:ecr:ap-northeast-1:123412341234:repository/*",
"Effect": "Allow"
},
{
"Action": [
"s3:GetObject",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::docker-app-component/*",
"Effect": "Allow"
}
2. docker-compose.yamlの保存
S3 バケットにコンテナ実行用の docker-compose.yaml を保存します。
今回利用する docker-compose.yaml の内容は以下です。
version: '3'
services:
nginx:
image: 123412341234.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-eval:v1
container_name: "nginx"
environment:
- NGINX_HOST=foobar.com
- NGINX_PORT=80
ports:
- 8080:80
3. カスタムコンポーネントの作成
コンテナ実行用の Greengrass カスタムコンポーネントを作成します。
今回はコンポーネントを YAML 形式で入力し作成します。
留意点
・今回は ECR からコンテナイメージを取得するため、Docker application manager を依存関係として ComponentDependencies で指定しています。
・Artifacts には、ECR 上のイメージと S3 バケットの docker-compose.yaml ファイルの URIを指定しています。
4. カスタムコンポーネントのデプロイ
カスタムコンポーネントを Greengrass コアデバイスに対してデプロイします。
今回は手順については省略します。
5. 動作チェック
エッジデバイス上でコンテナが Pull が完了しているか確認します。
# docker images | grep nginx
123412341234.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-eval v1 fc5ec3f147e4 13 days ago 135MB
コンテナが動作しているか確認します。
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fdf6c24750e4 123412341234.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-eval:v1 "/docker-entrypoint.…" 16 hours ago Up 16 hours 0.0.0.0:8080->80/tcp nginx
# curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
無事 nginx コンテナが動いていることが確認できました!
まとめ
今回は AWS IoT Greengrass を利用してエッジデバイス上でコンテナを実行してみました。
感想としては、事前準備さえ行えば Greengrass コンポーネントのデプロイによって自動的にデバイス上でコンテナが実行されるのが便利だと感じました。また、ECR に対するアクセスで Docker application manager がデバイスに付与された Role を利用してくれるので、認証も楽に行うことができました。
また、検証時に気付いた課題としては以下のような点が挙げられます。
・今回の手順では、あくまでコンポーネントが docker-compose でコンテナを起動するだけであり、Docker Application Manager がコンテナの状態管理は行いはしない。
・コンテナイメージを更新する際は、ECR上のコンテナイメージの更新とコンポーネントのアーティファクトの設定変更が必要 (必要に応じて S3 の docker-compose.yaml の編集も必要) となり、若干煩雑な手順となる。
今後は実運用に向けて動作検証を実施していきたいです。
つまづいた箇所
コンポーネントのデプロイを行う際に、アップロード後のファイルを変更した後チェックサムのミスマッチで S3 上のファイルのダウンロードに失敗することがありました (以下はエラーメッセージ)。
今回はコンポーネントを新しいバージョンでデプロイすることで解決しました。
com.aws.greengrass.componentmanager.exceptions.ArtifactChecksumMismatchException: Integrity check for downloaded artifact failed. Probably due to file corruption.