2016-08-07 19 views
11

プライベートDockerレジストリを設定し、イメージをAWS S3インスタンスに保存しようとしています。レジストリは正常に動作しているようです - それは正常に起動し、私はhttpsでそれを認証することができます。私が抱えている問題は、S3に保存する際にエラーが発生しているため、S3 IAMポリシーにいくつかのアクセス許可の問題があると仮定します。プライベートDockerレジストリからDockerイメージをAWS S3バケットに保存できません

docker runコマンドは次のようになります。

docker run -p 443:5000 \ 
    --link redis:redis \ 
    -e REGISTRY_STORAGE=s3 \ 
    -e REGISTRY_STORAGE_S3_BUCKET=my-docker-registry \ 
    -e REGISTRY_STORAGE_S3_ACCESSKEY=**** \ 
    -e REGISTRY_STORAGE_S3_SECRETKEY=**** \ 
    -e REGISTRY_STORAGE_S3_REGION=us-east-1 \ 
    -v `pwd`/auth:/auth \ 
    -e REGISTRY_AUTH=htpasswd \ 
    -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ 
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ 
    -v `pwd`/certs:/certs \ 
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/my.com_chain.crt \ 
    -e REGISTRY_HTTP_TLS_KEY=/certs/my.com.key \ 
    -e REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR=redis \ 
    -e REGISTRY_REDIS_ADDR=redis:6379 \ 
    registry:2.5 

そしてS3 IAMポリシーは次のようになります。

{ 
    "Version":"2012-10-17", 
    "Statement":[ 
     { 
     "Effect":"Allow", 
     "Action":[ 
      "s3:ListAllMyBuckets" 
     ], 
     "Resource":"arn:aws:s3:::*" 
     }, 
     { 
     "Effect":"Allow", 
     "Action":[ 
      "s3:ListBucket", 
      "s3:GetBucketLocation" 
     ], 
     "Resource":"arn:aws:s3:::my-docker-registry" 
     }, 
     { 
     "Effect":"Allow", 
     "Action":[ 
       "s3:PutObject", 
       "s3:GetObject", 
       "s3:DeleteObject", 
       "s3:ListMultipartUploadParts", 
       "s3:AbortMultipartUpload" 
     ], 
     "Resource":"arn:aws:s3:::my-docker-registry/*" 
     } 
    ] 
} 

エラー・ログ項目がある:私はしました

level=error msg="error resolving upload: s3aws: AccessDenied: Access Denied\n\tstatus code: 403, request id: 2B224..." auth.user.name=my-user go.version=go1.6.3 http.request.host=my.domain.com http.request.id=13b79c07-... http.request.method=PATCH http.request.remoteaddr="xx.xx.xx.xx:41392" http.request.uri="/v2/my-test/blobs/uploads/467d94ea-2a77...?_state=zQd-..." http.request.useragent="docker/1.12.0 go/go1.6.3 git-commit/8eab123 kernel/4.4.15-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.0 \\(darwin\\))" instance.id=8a8db6f1-8fe4 vars.name=my-test vars.uuid=467d94ea-2a77 version=v2.5.0 

他のアプリでのファイルアップロードにも同様のポリシーが使用されていたため、どこに問題があるのか​​わかりません。レジストリをS3バケットに保存できるようにするには、IAMポリシーを変更する必要がありますか?

+0

あなたはどのレジストリを使用しているか言及できますか?弾性コンテナサービス? –

+0

自分のレジストリを使用しています。Dockerfileは投稿にあります。 – ldg

答えて

6

私はそれを考え出した - 何かがドッカーは、画像ファイルを保存する方法に変更された場合はわからないが、あなたが今バケットレベルの権限(以下、中央ブロック、完全を期すためにフルに示すIAM)にs3:ListBucketMultipartUploadsを追加する必要がありそうです。

{ 
    "Version":"2012-10-17", 
    "Statement":[ 
     { 
     "Effect":"Allow", 
     "Action":[ 
      "s3:ListAllMyBuckets" 
     ], 
     "Resource":"arn:aws:s3:::*" 
     }, 
     { 
     "Effect":"Allow", 
     "Action":[ 
      "s3:ListBucket", 
      "s3:GetBucketLocation", 
      "s3:ListBucketMultipartUploads" 
     ], 
     "Resource":"arn:aws:s3:::my-docker-registry" 
     }, 
     { 
     "Effect":"Allow", 
     "Action":[ 
       "s3:PutObject", 
       "s3:GetObject", 
       "s3:DeleteObject", 
       "s3:ListMultipartUploadParts", 
       "s3:AbortMultipartUpload" 
     ], 
     "Resource":"arn:aws:s3:::my-docker-registry/*" 
     } 
    ] 
} 

今はうまくいくと思われます。

次の手順では、上記のdocker run argsを持つドッカー作成ファイルを作成し、そのファイルにredisコンテナを追加します。完全なプライベートレジストリソリューションです。

1

アクセスキーが使用されているIAMユーザーにS3 IAMの役割が割り当てられているかどうかを確認してください。このロールをEC2インスタンスに割り当てて、このアクセスキーの使用を避けることもできます。

+0

ありがとう@ shankar-p-s - IAMアクションをワイルドカード '*'に変更すると動作します。これはむしろ実行しませんが、私はどこの権限が不足しているのかを知る必要があります。私はコンテナ内でレジストリを実行しているので、EC2インスタンスに役割を割り当てることができず、ポータブルにすることもできます。 – ldg

関連する問題