動機
由於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
留言
張貼留言