動かざることバグの如し

近づきたいよ 君の理想に

AWS ECRにDockerイメージをPrivateにPushする

ECRって馴染み無いからなんだろうけど、公式サイトが「Amazon ECR レジストリ」って謳ってるのなんかウケる

概要

FargateにデプロイするにあたってAWSにコンテナをPushする必要がでてきたのでメモ

ちょうどタイムリーにPublic Registoryもリリースしてたしね

www.publickey1.jp

ゴールとしては docker push してAWS ECRにpushできるようにしたい

やり方

まずはAWSのアカウントはあるものとする

まずはAWSのリージョンを決める。今回はap-northeast-1にしておく。あとはレポジトリ名も決めておく。粒度がいまいちわかってないけどコンテナ名1つにつき1レポジトリになるはず。(1レポジトリには異なるタグでしか複数登録できない)

リージョンとレポジトリ名は頻出するので環境変数にセットしておく

export AWS_REGION=ap-northeast-1
export AWS_REPOSITORY_NAME=sample

まずはレポジトリの作成

aws ecr create-repository --repository-name ${AWS_REPOSITORY_NAME} --region ${AWS_REGION}

作成したレポジトリを見てみる

aws ecr describe-repositories --region ${AWS_REGION}

以下のように表示されれば正常に作成されている

{
    "repositories": [
        {
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:173603934556:repository/sample",
            "registryId": "xxxxxxxxxxxxxxxx",
            "repositoryName": "sample",
            "repositoryUri": "xxxxxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sample",
            "createdAt": "2020-12-29T23:37:55+09:00",
            "imageTagMutability": "MUTABLE",
            "imageScanningConfiguration": {
                "scanOnPush": false
            },
            "encryptionConfiguration": {
                "encryptionType": "AES256"
            }
        }
    ]
}

結果の registryId ってのが今後使うので、こいつも環境変数にセットしておく

export AWS_REGISTRY_ID=xxxxxxxxxxx

次にdocker pushできるようにdockerコマンドにAWSのログイン情報を紐付ける。

aws ecr get-login-password --region | docker login --username AWS --password-stdin ${AWS_REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

aws ecr get-login-password --region でログイン用のハッシュ?が生成されるのでそれを標準入力でdocker loginする形。

実際にpushしてみる

テスト用に簡単なDockerfileを用意する

FROM alpine
CMD ["echo", "nyaa"]

でECRにpushできるようにタグを付けてビルド

docker build -t ${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_REPOSITORY_NAME}:latest .

念の為動作確認

docker run --rm ${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_REPOSITORY_NAME}

いざpush

docker push ${AWS_REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_REPOSITORY_NAME}

イメージの確認

aws ecr list-images --repository-name ${AWS_REPOSITORY_NAME} --region ${AWS_REGION}

うまくいけばこれでpushできるはず。やったね

参考リンク