カスタム Docker Image を ECR で管理して、 CircleCI から利用する #AWS #Docker #CircleCI

概要

php のプロジェクトに CircleCI を導入した。

PHP の拡張(特に grpc 拡張)のインストールに時間がかかるため、独自イメージを用意してそれを使うことにした。

イメージの管理には Amazon Elastic Container Registry (ECR) を使ってみた。

ECR でリポジトリの作成

ECR でリポジトリを作成する。

とりあえず myphp みたいな名前にするが、名前空間も作れる ( grpc/php みたいに)。

他にタグの上書きを禁止したり、脆弱性診断のスキャンをする設定もある。

docs.aws.amazon.com

Dockerfile の作成

FROM circleci/php:7.1.32-fpm-stretch

# install grpc-extension
RUN set -x \
  && sudo pecl install grpc \
  && sudo docker-php-ext-enable grpc

CMD ["/bin/sh"]

CircleCI のイメージをベースに、 grpc 拡張をインストールした後、有効化している。

cloud.google.com

Dockerfile のビルド

ビルドする。

docker image build -t myphp:7.1.32-fpm-stretch .

ECR 用のタグを作成する。

docker tag myphp:7.1.32-fpm-stretch \
  ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/myphp:7.1.32-fpm-stretch

アカウント ID や リージョンは適宜置き換える。

ECR に push

ECR にログインする。

get-login がログインコマンドを返してくれるので、そのまま実行可能。

$(aws ecr get-login --region ${AWS_REGION} --no-include-email)

ECR に push する。

docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/myphp:7.1.32-fpm-stretch

list-images でイメージの一覧を確認可能。

aws ecr list-images --repository-name myphp

CircleCI からの利用

Image はこんな感じで利用できる。

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY は CircleCI 側で環境変数に入れておく。

docker:
  - image: ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/myphp:7.1.32-fpm-grpc
    aws_auth:
      aws_access_key_id: ${AWS_ACCESS_KEY_ID}
      aws_secret_access_key: ${AWS_SECRET_ACCESS_KEY}

circleci の CLI で試すならこんな感じ

circleci build \
  -e AWS_ACCOUNT_ID=XXXX \
  -e AWS_REGION=ap-northeast-1 \
  -e AWS_ACCESS_KEY_ID=XXXX \
  -e AWS_SECRET_ACCESS_KEY=XXXX

CI であれば、読み取り用の権限だけで動く。

  • ecr:GetAuthorizationToken
  • ecr:BatchCheckLayerAvailability
  • ecr:GetDownloadUrlForLayer
  • ecr:GetRepositoryPolicy
  • ecr:DescribeRepositories
  • ecr:ListImages
  • ecr:DescribeImages
  • ecr:BatchGetImage

あたり。

docs.aws.amazon.com

補足

grpc のイメージは現状メンテナンスされていないようだった。

github.com

参考