閉域 EKS 用にイメージを pull して push する

閉域 EKS クラスター用にイメージを pull してきて ECR に push する用のシェルスクリプト

#!/bin/bash

# 引数でリポジトリの URL をもらう
# k8s.gcr.io/cpa/cluster-proportional-autoscaler:1.0.0
# これを ECR の cpa/cluster-proportional-autoscaler:1.0.0 にアップロードする

set -eu
set -o pipefail

# 引数の数が1でなければエラー
if [ $# -ne 1 ]; then
  echo "実行するには 1 個の引数が必要です。" 1>&2
  exit 1
fi

origin_image=$1
origin_repo=${origin_image%%:*}
tag=${origin_image##*:}
ecr_repo=${origin_repo#*/}

# リポジトリがなければ作成
if aws ecr describe-repositories --repository-names ${ecr_repo} > /dev/null 2>&1; then
  echo "リポジトリが既に存在します。"
else
  aws ecr create-repository --repository-name ${ecr_repo}
fi

# イメージをプル
docker pull ${origin_repo}:${tag}

# ECR にログイン
AWS_REGION="ap-northeast-1"
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

# タグ付け
docker tag ${origin_repo}:${tag} ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ecr_repo}:${tag}

# イメージをプッシュ
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ecr_repo}:${tag}