【Docker , AWS ECR repository】在AWS ECS上面建立私有的Docker repository,使用sts ecr GetAuthorizationToken

動機


由於dockerhub中private專案必須收費
於是主管問說有沒有相對應的AWS方案
當然有,aws無所不能阿 (錢包夠滿的情況下 XD)

解決方案


1. 使用ec2 role建立docker login帳號密碼
1.1 使用 AWS CLI 直接取得命令
1.2 使用 GetAuthorizationToken API 取得 Base64編碼後的token
2. 使用建立的指令做docker login
3. push & pull docker images

過程


首先進入AWS console -> ECS -> repository

接著按Create repository

這時候就可以取得 Repository URI 了,這個先複製下來等等會用到。

接著來搞定docker login部分
這邊有分成兩種方式
一種是直接讓 AWS CLI處理,另外一種是自己寫程式處理
直接讓CLI處理最簡單,但是有鑑於不太方便還要登入機器才能使用,所以在這邊不採用
注意用這種方式取得的STS憑證預設是12小時,過期請重新取號 (ref:LINK)


AWS CLI
使用方式直接打指令即可 aws ecr get-login --region ap-northeast-1 (ref:LINK)
他就會回傳docker login的指令了
[root@ip-10-152-112-188 ~]# aws ecr get-login --region ap-northeast-1

docker login -u AWS -p ey中略兩千字J9 -e none <<Repository URI>>
直接把這個指令複製執行一次就可以了
如果被access deny 記得開 IAM Policy ecr:GetAuthorizationToken
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1498717042000",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

PHP SDK ECR API
你也可以像我一樣使用API去處理,但是注意回來的TOKEN並不是密碼
你必須先用base64 decode以後在去除字串頭的 AWS: (ref:LINK)
public function getEcrCommand(){
      $ECR = new \Aws\Ecr\EcrClient([
          'region' => env('AWS_EC2_REGION'),
          'version' => 'latest'
      ]);
      $ECR_result = $ECR->getAuthorizationToken()->get('authorizationData')[0];
      $echo_result =  "docker login -u AWS -p ".substr(base64_decode($ECR_result["authorizationToken"]),4)." -e none ".$ECR_result["proxyEndpoint"];
      return $echo_result;
    }
回傳的結果會跟用CLI執行的類似
當然我還是推薦使用第二種方法
因為他當下的權限會使用 EC2 的 ROLE當作基準
省去設定user的key,也保存了安全性

設定 ECR repository 權限
在這邊建議設定該role產生的token才能使用
並把權限縮減到只有push pull的能力



驗證


直接來推推看就知道囉!(ref:LINK)
[root@localhost opt]# docker pull <<account-id>>.dkr.ecr.ap-northeast-1.amazonaws.com/test:v1

留言