ども、かっぱです。

tl;dr

AWS Elastic Beanstalk上でアプリケーションを動作させる時に、t2.nano Am...

aws.typepad.com

とのことでちっくと試してみました。

メモ

引き続き教材は

Contribute to oreno-eb-worker development by creating an account on GitHub.

github.com

引き続き Worker Tire で Cron っぽいやつをやってみます。

ひとまずは ECR に build して push

  • リポジトリを作る
$ aws --region us-east-1 ecr create-repository --repository-name oreno-sinatra-worker
  • ECR にログインする
$ aws ecr get-login --region us-east-1
$ docker login -u AWS -p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(ホントはもっと長い)xxxxxxxxxxxxxxxxxxxxx -e none https://xxxxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com
  • build する
$ docker build --no-cache=true -t oreno-sinatra-worker .
  • tag を付ける
$ docker tag -f oreno-sinatra-worker:latest xxxxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/oreno-sinatra-worker:latest
  • push する
$ docker push xxxxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/oreno-sinatra-worker:latest
  • push されていることを確認
$ aws --region us-east-1 ecr list-images --repository-name oreno-sinatra-worker
{
    "imageIds": [
        {
            "imageTag": "latest",
            "imageDigest": "sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        }
    ]
}

Elastic Beanstalk インスタンスに適用する IAM role にポリシーを追加(1)

以下のように Elastic Beanstalk インスタンスに適用されている IAM role にマネージドポリシー(AmazonEC2ContainerRegistryReadOnly)を追加する。

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

マネージドポリシーを適用することで、今後の機能追加等で IAM ポリシーをイチイチいじる必要が無いのが嬉しい。

ECR へのログイン情報を S3 バケットにアップしておく

Elastic Beanstalk で Docker イメージを利用する際に、Docker Hub やプライベートリポジトリからイメージを取得してくることになりますが、認証情報を S3 バケットに置いておく必要があります。もちろん、ECR も同じ事が言えるので、先ほど ECR のリポジトリにログインした際に利用した認証情報を S3 バケットに保存しておきましょう。

尚、ログインの際に利用した認証情報は ~/.docker/config.json に格納されています。

$ cat ~/.docker/config.json
{
        "auths": {
                "https://xxxxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com": {
                        "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(ホントはもっと長い)xxxxxxxxxxxxxxxxxxxx",
                        "email": "none"
                }
        }

上記のファイルを S3 Bucket にアップロードしておきます。

#
# S3 Bucket を作成する
#
$ aws --region ap-northeast-1 s3 mb s3://oreno-docker-auth

#
# S3 Bucket に認証情報をアップする
#
$ aws --region ap-northeast-1 s3 cp ~/.docker/config.json s3://oreno-docker-auth/oreno-docker-auth.txt

Beanstalk インスタンスに適用する IAM role にポリシーを追加(2)

上記で作成したバケットへのアクセスも許可する必要があるので IAM role にポリシーを追加します。こちらもマネージドポリシーの AmazonS3ReadOnlyAccess をアタッチしておきました。実運用を想定する場合には適切なポリシーを与えるように検討したいところです。

Dockerrun.aws.json を修正

今回は Docker イメージを利用する為、以下のように AuthenticationImage を追記しました。

{
  "AWSEBDockerrunVersion": "1",
  "Authentication": {
    "Bucket": "oreno-docker-auth",
    "Key": "oreno-docker-auth.txt"
  },
  "Image": {
    "Name": "xxxxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/oreno-sinatra-worker:latest",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "4567"
    }
  ],
  "Volumes": [
    {
      "HostDirectory": "/tmp",
      "ContainerDirectory": "/tmp"
    }
  ],
  "Logging": "/var/log/nginx"
}

Authentication には ECR にログインする為の認証情報を保存している Bucket とファイル名(キー)、そして Image には ECR のリポジトリを定義しています。

eb create

後は以下のように eb create を実行します。

$ eb create --tier worker --instance_profile ${Insance_Profile_Name}

しばし待ちましょ。

確認

  • 各種ログの確認

eb ssh でログインして各種ログを確認してみます。

#
# /tmp/docker_build.log を確認
#
$ cat /tmp/docker_build.log
Sending build context to Docker daemon 14.34 kB
Sending build context to Docker daemon
Step 0 : FROM xxxxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/oreno-sinatra-worker:latest
 ---> 45afb86977eb
Step 1 : EXPOSE 4567
 ---> Running in 215ae90196d6
 ---> aa4a2596cf6f
Removing intermediate container 215ae90196d6
Successfully built aa4a2596cf6f

#
# /tmp/docker_pull.log を確認
#
$ cat /tmp/docker_pull.log

(snip)

45afb86977eb: Pull complete
Remote Digest:
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for xxxxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/oreno-sinatra-worker:latest
  • Woker アプリケーションのログを確認

eb ssh でログインして Worker アプリケーションのログを確認してみます。

[ec2-user@ip-10-134-164-40 tmp]$ tail /tmp/sinatra.log
I, [2016-01-16T10:00:00.014747 #8]  INFO -- : bar
I, [2016-01-16T10:02:42.844395 #8]  INFO -- : bar
I, [2016-01-16T10:05:33.582870 #8]  INFO -- : bar
I, [2016-01-16T10:05:59.486555 #8]  INFO -- : bar
I, [2016-01-16T10:06:59.511213 #8]  INFO -- : bar
I, [2016-01-16T10:07:59.553031 #8]  INFO -- : bar
I, [2016-01-16T10:08:59.519486 #8]  INFO -- : bar
I, [2016-01-16T10:09:59.543144 #8]  INFO -- : bar
I, [2016-01-16T10:10:59.513466 #8]  INFO -- : bar
I, [2016-01-16T10:11:59.514448 #8]  INFO -- : bar

一応、一分毎に Worker アプリケーションにアクセスが発生していることがわかります。しめしめ。

終わり

ということで、Elastic Beanstalk から ECR のコンテナイメージを利用することが出来ました。ギョームで使うことは多分無いと思いますが東京リージョンでのサービス開始が待ち遠しです。

元記事はこちら

(超メモ)Elastic Beanstalk で ECR の Docker イメージをデプロイするメモ