1. sho_oboegaki

    Posted

    sho_oboegaki
Changes in title
+AWSのECRに置いたコンテナイメージをお引越ししてみた
Changes in tags
Changes in body
Source | HTML | Preview

 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ファイル化したりしなくても良いかもしれない。

①loginで移転元の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ファイルでやり取りした方が若干早かったりします。)
 それでは。