AWSのECRに置いてあるコンテナイメージをテスト環境から本番環境に移転させるという業務があり、ザッと調べてもパッとは出てこなかったので、やり方を残しておこうと思います。
本来、コンテナはdockerfileを書いてそれを管理した方が良いのですが、そんなものは残ってなかったし、ぺーぺーの自分はそんなことすら知らなかった。
#ECR上のコンテナイメージを移転する
今回は2パターンのやり方を紹介します。
1:コンテナイメージをtarファイル化し、ローカルを経由してお引越し
2:コンテナイメージを直接pullして、そのままpushしてお引越し
本記事では、お引越し先のAWS環境を移転先、お引越し元のAWSアカウントを移転元と表記します。
※スクショないです、追加できたらやります。
#環境
ローカルOS:windows10
ターミナルソフト:Rlogin
EC2のインスタンスタイプ:t3.medium
#1:コンテナイメージをtarファイル化し、ローカルを経由してお引越し
実際の業務ではこちらを採用しました。2つ目の方が早くて簡単ですが、無作法なので却下されました。
大まかな流れとしては、こんな感じになります。
①Rloginで移転元のEC2インスタンスにログインする
②EC2インスタンスからAWSコマンドで移転元のECRにログインして、任意のコンテナイメージをpullする
③pullしてきたコンテナイメージをtarファイル化して、ローカルにダウンロードする
④移転元のEC2インスタンスから切断し、Rloginで移転先のEC2インスタンスにログインする
⑤tarファイル化したコンテナイメージをEC2インスタンスにアップロードして展開する
⑥展開して出来たコンテナイメージにtagをつけて、移転先のECRにpushする
実践したわけじゃないけれど、多分ローカルにDocker Desktopをインストールして、AWSコマンドを叩けるようにしておけば、(クレデンシャル情報が載ってるconfigureファイルがローカルにガッツリ残ることはさておき)わざわざRlogin使ったりtarファイル化したりしなくても良いかもしれない。
###①Rloginで移転元のEC2インスタンスにログインする
ぶっちゃけEC2インスタンスに接続できればなんでも良いので省略
###②EC2インスタンスからAWSコマンドで移転元のECRにログインして、任意のコンテナイメージをpullする
EC2インスタンスに接続したら、次のawsコマンドでECRへ接続するためのトークンを発行します。
aws ecr get-login --no-include-email
このコマンドの戻り値を余すことなくcopy&paste&EnterすることでECRをいじることができるようになります。
###③pullしてきたコンテナイメージをtarファイル化して、ローカルにダウンロードする
一旦、AWSのコンソールでECRのリポジトリを見に行きます。そこでお引越し対象のコンテナイメージのURLを確認しておきます。
EC2インスタンスで、次のAWSコマンドでECRからお引越し対象のコンテナイメージをpullしてきます。
docker pull (コンテナイメージのURL)
pullできたら次のコマンドでtarファイル化します。
docker save -o (任意のファイル名).tar (コンテナイメージ名)
終わったら、ローカルの任意の場所にダウンロードしておきます。
###④移転元のEC2インスタンスから切断し、Rloginで移転先のEC2インスタンスにログインする
移転元での作業を終わりなので切断します。ここからは移転先での作業なので、移転先EC2インスタンスに接続します。
###⑤tarファイル化したコンテナイメージをEC2インスタンスにアップロードして展開する
移転先のEC2インスタンスに接続できたら、さっきのコンテナイメージのtarファイルをアップロード、次のコマンドで展開します。
docker load -i (ファイル名).tar
###⑥展開して出来たコンテナイメージにtagをつけて、移転先のECRにpushする
展開したコンテナイメージのコンテナイメージIDを"docker images"コマンドで確認したら、次のコマンドでタグ付けします。
docker tag (コンテナイメージ名) (push先リポジトリのURL)
最後に次のコマンドでコンテナイメージをpushします。(手順②のECRへの接続を忘れずに)
docker push (push先リポジトリのURL)
AWSのコンソールでECRのリポジトリを見に行き、コンテナイメージが確認出来たらお引越し成功です。
#2:コンテナイメージを直接pullして、そのままpushしてお引越し
移転元のECRから移転先のEC2に直接コンテナイメージをpull、そのまま移転先のECRにpushする方法です。上の方で無作法と言われた理由としては、移転先EC2インスタンスで移転元のクレデンシャルを使って移転元のECRを直接触るからです。
大まかな流れとしては、こんな感じになります。
①Rloginで移転先のEC2インスタンスにログインする
②EC2インスタンスからAWSコマンドで移転元のECRにログインして、任意のコンテナイメージをpullする
③EC2インスタンスからAWSコマンドで移転先のECRにログインして、任意のコンテナイメージをpushする
お手軽、簡単、でも無作法
pullしてきたコンテナイメージに、tag付けだけすればpushできます。
#まとめ
今回は、AWSのECRに置いてあるコンテナイメージを別のAWS環境に移転させる方法についてまとめてみました。クレデンシャルの管理とかを徹底するなら、手間はかかりますが方法1で作業するのが良いかと思います。そこまで気にしない、作業した後にちゃんとクレデンシャルを削除します、というなら方法2もアリといえばアリかもしれないです。方法2の場合、ローカル環境にDocker DesktopとAWSCliをインストールしておけば、コマンドプロンプトでこと足りる気もしてます。
コンテナの管理としては、dockerfileで書いて残しておくことで共有しやすくなる、というか本来のお作法だと思いますので、自分がゼロからコンテナを作る場合は、ちゃんとdockerfile残しておきたいと思いました。(ただ、コンテナをbiuldする際にインストールするものが多かったりする場合は、tarファイルでやり取りした方が若干早かったりします。)
それでは。