GreengrassのDocker Connectorを試す

### Greengrass の設定

Greengrassの初期設定は他のサイトで。。デプロイ設定などができるところまでできている前提です。

今回は以下のサイトを参考にしながら、手元にデバイスが無いのでCloud9上にGreengrassを入れます。
新しいバージョンのGreengrass（Greengrass Core Version 1.10.0）を使う必要があります。 
https://aws.amazon.com/jp/blogs/news/new-aws-iot-greengrass-adds-docker-support-and-streams-management-at-the-edge/


### ECR にDocker imageをPushする

まずはECRのリポジトリを作成します。`gg-docker-test`という名前にしました。
そして、上記サイトにならって、イメージの作成に必要なファイルを作って行きます。


```python:app.py
from flask import Flask

app = Flask(__name__)

counter = 0

@app.route('/')
def hello():
    global counter
    counter += 1
    return 'Hello World! I have been seen {} times.\n'.format(counter)
```

```text:requirements.txt
Flask==1.0.2
```

```dockerfile:DockerFile
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
```

すべて、docker-originというディレクトリを作って入れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/348d9608-0d61-c774-15d6-10e6f943ad3e.png)

で、Docker Buildで、イメージを作成します。

```bash
cd docker-origin
docker build -t ggtest . -f ./DockerFile
docker images
```


今回は立ち上げているCloud9上でDocker Imageを作成して、ECRにPushします。

そのままだとECRへのアクセスができないため、別のIAMユーザーを作成し、`AmazonEC2ContainerRegistryPowerUser ` を付与します。
以下で払い出したIAMをセットします。

```
aws configure --profile ecr
```

これでECRにアクセスできるようになったので、Push

```sh
docker tag <image-id> <your-id>.dkr.ecr.ap-northeast-1.amazonaws.com/gg-docker-test
aws ecr get-login --region ap-northeast-1 --profile ecr --no-include-email
docker login -u AWS -p eyJwY...
docker push <your-id>.dkr.ecr.ap-northeast-1.amazonaws.com/gg-docker-test:latest
```

### docker-compose をS3に置く

```yaml:docker-compose.yml
version: '3'
services:
  web:
    image: "<your-id>.dkr.ecr.ap-northeast-1.amazonaws.com/gg-docker-test:latest"
    ports:
      - "80:5000"
```

これを、任意のS3のロケーションにおきます。

## Greengrass groupのConnectorsで、Dockerの設定

作成済みのGG group を選び、Connectors→Add a connector

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/3ad01e09-b390-8c46-727f-4a851e439083.png)

Select a connectorの画面でDocker Application Deploymentを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/dca02b8d-248b-c651-5a59-712eaa1e80dd.png)

environmentの下にdockerディレクトリを作り、そこにdocker-compose.ymlがDLされるように設定しました。また、Cloud9上のユーザー（ec2-user）で実行するために、Docker user ID をセットしてます。 デフォルトだとggc_user

Cloud9だとデフォルトではdocker-composeがインストールされていないので、入れます。（あとでGreengrassが呼び出します）

```sh
sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/861feb6c-6ebc-2705-afe2-c95916cedf35.png)


## Greengrass Groupのデプロイ

ここまで設定したら、Cloud9上でGreengrassを実行後、
Greengrass groupのデプロイを実施します。

### ログチェック

Dockerのデプロイに関するデバッグログは、以下でチェックします。

```sh
sudo tail -F /greengrass/ggc/var/log/user/ap-northeast-1/aws/DockerApplicationDeployment.log
```

## 動作確認

デプロイが成功すると、 `docker ps` コマンドでImageがいることが確認できます。

```sh

# コンテナのIPアドレス取得
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container-id>
# curl で叩く
curl <ip-address>:5000
```
結果、`Hello World! I have been seen 3 times.` のような値が受け取れました。

ローカルLambdaでもこういった実装自体は可能ですが、ECRなどでコンテナリポジトリの管理を行いたいユースケースでは使えそうです。