初心者インフラエンジニアが困ったときに試行錯誤するブログ

インフラエンジニアが,開発の勉強をするときのログを残します

DockerでRailsを動かす その3

実現したいこと

AWS ECS上で,Railsプロジェクトを動かしてみようと思います.

前回の戦いはこちら

ktaka.hatenablog.com

やったこと

ECSをさっそく立ち上げて,前回動いたDockerのイメージを載せてみたいと思います.

AWSのアカウントはあるので,ECSでFargateを使用します.

f:id:tktkttr:20181114224803p:plain

ポチポチしていくだけで完了.サービス名やVPNなどは,適当で.

とりあえず動かすのを目的にします.

f:id:tktkttr:20181114225537p:plain

first_taskをとりあえず定義すれば,あっという間にサンプルタスクがうごきました.これはすごい...

Fargateはタスクに対して秒単位で課金されるので,直ちにfirst_taskを停止.

次に,ローカルで作ったイメージをこのsample appの変わりに起動させたいと思います.

そのためには,ECRというコンテナレポジトリにイメージを登録する必要があるとのこと.

ECSのメニューバーからECRに飛べて,ポチポチするだけなので秒で作成完了.CLIからのpushなどの操作方法まで示してくれる親切設計.

さーて指示通りにCLIからpushするかーと思ったら,

$ aws help
bash: aws: command not found

あれ?CLIインストールしてなかったっけ? というわけでインストールします.

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo python get-pip.py
$ sudo pip install awscli

はい,簡単ですね!と思いきや...

matplotlib 1.3.1 requires nose, which is not installed.
matplotlib 1.3.1 requires tornado, which is not installed.
Installing collected packages: urllib3, jmespath, six, python-dateutil, docutils, botocore, pyasn1, rsa, colorama, PyYAML, futures, s3transfer, awscli
  Found existing installation: six 1.4.1
Cannot uninstall 'six'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

....??????

noseとtornadoが必要でsixがアンインストールできないとのこと.

一個ずつやってみるか.

$ sudo pip install tornado
$ sudo pip install nose
...
Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/man'

環境のparmissionエラーかなにかが出たが,再度実行すると出ないし問題ないみたい.

sixの更新をしてみる

$ sudo pip install six -U
...
Cannot uninstall 'six'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

更新できない?uninstallを頑なに拒んでくるんだが.

こいつは無視できないのか?

$ sudo -H pip install awscli --upgrade --ignore-installed six
$ aws help

インストールできた...!!!

さて,忘れないうちにAWS CLIのプロファイルも作っておきましょう.

アクセスキーは,AWSコンソールの,認証情報>ユーザーから作れます.

$ aws configure --profile <profile名>
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1
Default output format [None]: json

$(aws ecr get-login --no-include-email --profile <profile名>) #自動ログイン

ようやくこれでコンテナイメージをpushできる!

と思いきや

$ docker tag <コンテナイメージ名>:<ローカルのタグ> <AWS-ECRリポジトリに登録するイメージタグ> #ECRリポジトリ作成時の指示通りに進める
$ docker push <タグ名>
...
no basic auth credentials

あーーーー,認証エラー.

これは調べてみると,リージョンがずれていた模様.

$ vi ~/.aws/config 

で書き換えて,再ログインし,実行!!!

無事push成功しました.

立ち上げようと思い,Fargateのタスク定義から,コンテナイメージURIを選択.

実行しようと思ったら,

Security group ... does not appear to belong to the same VPC as the input subnets.

というエラーが.

サブネットを変えて,タスク定義を編集し,実行してみると,うまくいった.

IPv6はdisableでもいいらしい.v4が使えるからか.ネットワーク周りは,ざっくりとした理解しかしていないからもっと精緻に知っておく必要があるなぁ.

起動は一瞬するんだけど,すぐにPENDINGになり,タスクが消えてしまう.

これはなんだろう.コンテナの起動はローカルでは成功しているのに.設定がなにか間違っているのか?

...続く

参考

以下の記事を参考にさせていただきました.

早速AWS Fargateで、ECSで動かしているタスクを動かしてみた! - コネヒト開発者ブログ

AWS CLI のインストールと設定 - Amazon Kinesis Data Streams

https://saku.io/failed-to-install-awscli-on-mac/

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/common-errors-docker.html#error-403

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.