つばくろぐ @takamii228

知は力なり

AWS ElasticBeanstalkにDocker Imageをさくっとデプロイしてみた

AWSのElasticBeanstalkのDockerホスティングを使ってDocker Imageをサクッとデプロイできたのでメモとして残しておきます。

デプロイするもの

int128先輩が作ったJiraのWebhookのJSONを加工してしてSlack / Mattermostに通知連携してくれるGoアプリを動かしてみます。

github.com

int128.hatenablog.com

ElasticBeanstalkにデプロイする

ドキュメントに従ってデプロイしてみます。

docs.aws.amazon.com

まずドキュメントに従ってDockerrun.aws.json作成しzipで固めたものを用意します。

// Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "int128/jira-to-slack"
  },
  "Ports": [
    {
      "ContainerPort": "3000"
    }
  ]
}

DockerfileとDockerrun.aws.jsonの2つをまとめたzipの場合は以下のように書けばOKです。

// Dockerfile
FROM int128/jira-to-slack

EXPOSE 3000
CMD ["/jira-to-slack"]
// Dockerrun.aws.json
{
    "AWSEBDockerrunVersion": "1",
    "Ports": [
      {
        "ContainerPort": "3000"
      }
    ]
}

マネジメントコンソールでElasticBeanstalkで以下の設定で環境を新規に作成します。

  • アプリケーション名
    • 適当な名前をつける
  • プラットフォーム
    • 汎用Docker
  • アプリケーションコード
    • コードのアップロードを選択して、上記で作ったzipファイルをアップロードする

最低限必要なものは上記だけですが、「さらにオプションを設定」を選択すると以下の項目が追加で設定できます。

  • ソフトウェア
    • ログローテの設定やCloudWatchLogsとの連携ができます
    • ElasticBeanstalkはリクエストをnginxが受けていて、そこのアクセスログやDockerのログをS3においたりCloudWatchLogsと連携したりできます
  • インスタンスタイプ
  • 容量
    • AutoScaling Groupの設定ができます。デフォルトは単一インスタンスです。
  • ロードバランサー
    • AutoScaling Groupを設定すると設定できます。単一インスタンスの場合は選択できません。
  • ローリング更新とデプロイ
    • デプロイメントの反映のさせ方の設定ができます。
  • セキュリティ
    • ElasticBeanstalkに付与するIAMロールが設定できます。
  • モニタリング
    • CloudWatchでモニタリングする項目やヘルチェの設定できます
  • 管理された更新
    • メンテナンスウィンドウによる更新を定期的に行う設定のようです
  • 通知
    • 通知をメールで飛ばせるようです
  • ネットワーク
    • vpcやパブリックIPが設定できます
  • データベース
    • RDSの設定ができます
  • タグ
    • タグが付けられます

上記の設定を変更したあとに アプリの作成 を選択すると、環境構築がスタートします。

3分程まつと環境構築が完了しアプリが利用できるようになります。

2019-01-30 22:56:57 UTC+0900 INFO    Environment health has transitioned from Pending to Ok. Initialization completed 49 seconds ago and took 2 minutes.
2019-01-30 22:56:15 UTC+0900    INFO    Successfully launched environment: Test-env
2019-01-30 22:56:15 UTC+0900    INFO    Application available at Test-env.xxxxxxx.us-east-1.elasticbeanstalk.com.
2019-01-30 22:55:58 UTC+0900    INFO    Docker container xxxxxxxxx is running aws_beanstalk/current-app.
2019-01-30 22:55:57 UTC+0900    INFO    Added instance [i-xxxxxxxxx] to your environment.
2019-01-30 22:55:50 UTC+0900    INFO    Successfully built aws_beanstalk/staging-app
2019-01-30 22:55:48 UTC+0900    INFO    Successfully pulled int128/jira-to-slack:latest
2019-01-30 22:55:24 UTC+0900    INFO    Waiting for EC2 instances to launch. This may take a few minutes.
2019-01-30 22:54:19 UTC+0900    INFO    Created EIP: xxxxxxxxxxxx
2019-01-30 22:54:03 UTC+0900    INFO    Created security group named: awseb-e-wi8p8yhmvx-stack-AWSEBSecurityGroup-E0I6S0124S51
2019-01-30 22:53:57 UTC+0900    INFO    Environment health has transitioned to Pending. Initialization in progress (running for 9 seconds). There are no instances.
2019-01-30 22:53:38 UTC+0900    INFO    Using elasticbeanstalk-us-east-1-xxxxxxxx as Amazon S3 storage bucket for environment data.
2019-01-30 22:53:38 UTC+0900    INFO    createEnvironment is starting.

ログを見るとS3バケットやSG、EIPが作られていることがわかります。

わずか数行でDocker Imageをデプロイすることができました。PaaSらくちん!

お片付け

環境を削除するときは アプリケーションの削除 を選択すれば作成したスタック一式が削除されます。

ただし作成されたS3バケットは残ってしまいます。このバケットはデフォルトでは手動で消せない設定になっているので、バケットポリシーを手でいじってから消すようにしましょう。

参考

コマンドラインツールのebコマンドを使えばローカルやCIを経由して継続的にデプロイすることも可能なようです。今回は頻繁に更新するようなものでもないので実施しませんでした。また別の機会に検証してみようと思います。

github.com