概要
docker imageのbuildからAWS Lambdaへのデプロイまでをrakeで実行できるようにしてみました
作成した動機
- lambdaでの動作テストのためにdocker imageのpushとlambdaのデプロイが頻繁に発生しており、いくつかのコマンドを何度も実行する必要があった
- 作成しているアプリケーションはrubyで作成されているため、shell scriptやmakeではなくrubyで完結させたい
- CIでもrakeを用いることでCI側の記述がシンプルになりそうだった
実装
task default: :docker_build
REGISTORY_URI = 'XXXXXXXXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com'
REPO_NAME = 'ECR REPOSITORY NAME'
IMG_NAME = 'IMG NAME'
TAG_NAME = 'TAG NAME'
FUNCTION_NAME = 'LAMBDA FUNCTION NAME'
task :docker_build do
sh %(docker build -t #{IMG_NAME} -f ./Dockerfile .)
end
task :aws_login do
sh %(aws ecr get-login-password | docker login --username AWS --password-stdin #{REGISTORY_URI})
end
task docker_push: %i[docker_build aws_login] do
sh %(docker tag #{IMG_NAME}:latest #{REGISTORY_URI}/#{REPO_NAME}:#{TAG_NAME})
sh %(aws ecr batch-delete-image --repository-name #{REPO_NAME} --image-ids imageTag=#{TAG_NAME})
sh %(docker push #{REGISTORY_URI}/#{REPO_NAME}:#{TAG_NAME})
end
task deploy: :docker_push do
option = "--function-name=#{FUNCTION_NAME} --image-uri=#{REGISTORY_URI}/#{REPO_NAME}:latest"
sh %(aws lambda update-function-code --no-publish #{option})
unless ENV['CI']
sh %(aws lambda wait function-updated --function-name=#{FUNCTION_NAME})
puts 'deploy DONE.'
end
end
task docker_run: :docker_build do
option = '--rm -it --env-file=./.env --mount type=bind,source=$(pwd),target=/app -p 9000:8080'
sh %(docker run #{option} #{IMG_NAME})
end
task docker_run_bash: :docker_build do
option = '--rm -it --env-file=./.env --mount type=bind,source=$(pwd),target=/app --entrypoint "bash"'
sh %(docker run #{option} #{IMG_NAME})
end
利用方法
# docker imageをbuildしたい
$ rake
# もしくは
$ rake docker_build
# deployしたい
rake deploy
# docker imageからインスタンスを作成してbashで操作したい
rake docker_run_bash