GreengrassのDocker application deployment connectorを使ってコアデバイスにコンテナをデプロイしてみた

CX事業本部@大阪の岩田です。Greengrass Core1.10から利用可能になったDockerアプリケーションのデプロイコネクタを試してみました。

環境

今回利用した環境です

  • OS: Amazon Linux2 (ami-011facbea5ec0363b)
  • Greengrass Core: 1.10
  • Docker: 18.09.9-ce

Docker application deployment connectorとは?

GreengrassのコアデバイスにDockerベースのアプリケーションをデプロイするための機能です。S3に配置したDocker Composeファイルを利用してコアデバイスにDockerコンテナをデプロイすることができます。コンテナのリポジトリにはDocker Hub以外にもECR等のプライベートリポジトリを使用することも可能です。

やってみる

実際にDocker application deployment connectorを使ってみましょう。今回はコアデバイスにPostgresqlのコンテナをデプロイしてみます。

コアデバイスのセットアップ

今回はEC2をコアデバイスとして利用します。こちらのブログを参考にセットアップを行います。

デバイスがなくても大丈夫!EC2でAWS IoT Greengrassを動かす #reinvent

一通りセットアップできたらDocker application deployment connectorを利用するための追加セットアップを行います。まずPython3.7とDockerをインストールします。

sudo yum install python3 docker

Dockerがインストールできたら、Docker application deployment connectorを実行するためのユーザーをdockerグループに追加します。今回は手抜きをしてGreengrass Core用のユーザーggc_userをそのままDocker application deployment connector用のユーザーとして利用します。本番利用の際はきちんと別ユーザーを作成しましょう。

sudo usermod -aG docker ggc_user

Dockerの自動起動を有効化し、サービスを起動します

sudo systemctl enable docker.service
sudo systemctl start docker.service

Docker Composeもインストールします

sudo pip3 install docker-compose

後ほどデプロイを実行した際にS3からDocker ComposeファイルをDLし、コアデバイスのローカルに保存する必要があります。適当なディレクトリを用意し、Docker application deployment connector用のユーザー(今回はggc_user)がアクセスできるように権限を付与します。

sudo mkdir /greengrass/ggc/data/
sudo chown ggc_user:ggc_group /greengrass/ggc/data/

Docker Composeファイルの準備

続いてDocker Composeファイルを作成します。

version: '3'

services:
  db:
    image: postgres:latest
    ports:
      - "5432:5432"

作成したDocker Composeファイルはどこか適当なS3バケットにアップしておきます。

aws s3 cp docker-compose.yml s3://<適当なS3バケット>

Greengrassロールの準備

GG Coreを実行するためのIAMロールを作成し、先程S3にアップしたDocker Composeファイルにアクセスできるように以下のアクセス許可を追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAccessToComposeFileS3Bucket",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<Docker ComposeファイルをUPしたS3バケット>/*" 
        }
    ]
}

準備ができたら作成したIAMロールをGreengrassグループに割り当てます。

コネクタの設定

一通り準備ができたので、Greengrassグループにコネクタを追加してデプロイしてみます。まずコネクタにDocker Application Deploymentを選択します。

続いて必要な設定値を入力します

  • Docker Compose file in S3には先程アップしたDocker Coposeファイルを選択
  • Directory path for local Compose fileには先程作成したディレクトリ/greengrass/ggc/data/を指定します

最低限必要な設定値はこれだけです。

設定完了です。Greengrassグループのデプロイを実行し、コネクタをデプロイします。

動作確認

デプロイが完了したらコアデバイスのEC2上でコンテナが稼働していることを確認してみましょう。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
9dfd108bea81        postgres:latest     "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        0.0.0.0:5432->5432/tcp   greengrassdockerapplicationdeployment_db_1

動いてますね。試しにpsqlで接続してみましょう。

$ psql -h localhost -U postgres
psql (9.2.24, server 12.1 (Debian 12.1-1.pgdg100+1))
WARNING: psql version 9.2, server version 12.0.
         Some psql features might not work.
Type "help" for help.

postgres=#

バッチリです!

まとめ

Docker application deployment connectorのご紹介でした。今回紹介したようにローカルLambdaから接続するためのDBをデプロイしたり、ローカルLambdaの代わりにエッジ側でビジネスロジックを実行するためのアプリケーションコンテナをデプロイしたり、、、といった感じで色々と構成の幅が広がりそうです。エッジ側でDocker Composeまで動かすのはスペック的にハードルが高そうな気もしますが、ラズパイ4などは十分なスペックを備えているので、今後はDockerベースのアプリをエッジ側に配置するという選択肢も頭に置いておきたいです。