はじめに
色々なサービスを使って、コンテナにしたplumberを動かしていましたが、今回はElastic Beanstalkを使いました。
概要
- ECRにコンテナをPUSHし、URIを記載した設定ファイル
Dockerrun.aws.json
を、Elastic Beanstalkに渡して実行します- Dockerファイルやソースファイルをzipでまとめて、それを渡す方法もあります
- 今回作るplumberのコンテナは、ビルドに時間がかかってzipの方法ではタイムアウトになるため、ECRにPUSHする方法を使いました。
- Dockerファイルやソースファイルをzipでまとめて、それを渡す方法もあります
やってみた
IAMロール、インスタンスプロファイル作成
まず、Elastic Beanstalkで実行するEC2用のインスタンスプロファイルを作成します。
またECRにアクセスするポリシーも付与する必要があります。
ただし、環境のインスタンスプロファイルにアクセス権限を付与することによって、Amazon ECR リポジトリのイメージにアクセスする権限をインスタンスに付与する必要があります。AmazonEC2ContainerRegistryReadOnly 管理ポリシーをインスタンスプロファイルにアタッチして、アカウントのすべての Amazon ECR リポジトリに対する読み取り専用アクセス権限を付与するか、
いつもはCloudformationで作成しますが、インスタンスプロファイル名が指定できないので、コンソールから作りました。
- 信頼関係
- EC2
- ポリシー
- AWSElasticBeanstalkWebTier
- AWSElasticBeanstalkWorkerTier
- AWSElasticBeanstalkMulticontainerDocker
- AmazonEC2ContainerRegistryReadOnly
- 名前
- aws-elasticbeanstalk-ec2-role
コンテナをBuildしてPUSH
t3.smallくらいのCloud9を用意して、以下のページの手順の一部を行いコンテナを作成し、ECRにPUSHします。
- ディレクトリ・ファイル作成
- イメージのBuild
- コンテナイメージを、ECR にアップロードする
設定ファイル作成
以下のページの Docker プラットフォームの設定 (Docker Compose なし) を参考に、Dockerrun.aws.json
を作成します
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest"
},
"Ports": [
{
"ContainerPort": 80
}
]
}
Image - Name に指定する文字列は、先のサイトの手順で作成したのであれば、以下のコマンドでURIを取得できます。
echo `aws cloudformation describe-stacks --stack-name ${STACKNAME} --query "Stacks[].Outputs[?OutputKey=='RepositoryUri'].[OutputValue]" --output text`:latest
Elastic Beanstalk実行
接続
動いているようですね。
おわりに
今回はElastic Beanstalkにコンテナを使ってみました。
ソース群をzipに固めた方が楽ではありますが、アプリが複雑になればbuildに要する時間が増え、タイムアウトを超える恐れを考えると、最初からECRを用いた方法を使った方が良いかもしれません。
この記事がどなたかのお役に立てれば幸いです。