AWSの権限がなくてもprivateなECRからimageをpullできるようにした話
About
この記事は LITALICO Engineers Advent Calendar 2021 2つ目 1日目の記事です。
株式会社LITALICOでSREグループのマネージャをしております、 tjinjinです。 今回はローカル環境改善の一貫でslack Appを作った話を書きたいと思います。
経緯
SREグループが見ているB2B向けサービスは、多くのBussiness Partnerの方々に協力いただいております。メンバーによってAWS経験があったりなかったり、開発環境がwindowsだったりMacだったりと多種多様な環境で開発しております。そういった中でローカル環境がうまく構築できないという課題がありました(後日詳細書くかも?)。
そこでローカル環境の構築のトラブルを減らすべく以下のような対応をしました。
- ローカルでのdocker imageのbuildを辞めて、事前にpushしてあるアプリケーション共通のimage(base imageとする)をECRからpullする
上記対応でローカル環境構築までの時間を短縮するという改善を目指しました。
base imageをprivateなECRに置いてますので、ECRからimageをpullするためにdocker loginが必要な状態がありました。
どうやったか
下記のような前提があります。
- ECRにあるprivateなrepositoryからimageをpullするためには、docker loginをする必要があります
- docker loginするにはawsコマンド及びIAMの権限が必要です
仮にIAMの権限があれば下記コマンドでdocker loginが可能です。
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com
上記を解決すべく、ここに1つの命が爆誕しました…:baby:
どう使うか
今回bolt framework + serverless frameworkを使ってslack Appとして作ってみました。API Gateway + lambda(python3)で動いています。
以下のような使い方ができます。
- botがいるチャンネルで、メンションつけて呼ぶ
- そうするとbotがDMでパスワードを送ってきてくれます!
- 送られてきたパスワードをコピーしてterminalで実行することで ECRにログインできます!
上記のようにすることでIAMユーザがなくてもslackさえ使えればpullすることができます。
補足
ただし、最低限のセキュリティとして社内のIPアドレスからのみdocker pullができるようにlambdaに紐付いているIAMロールのパーミッションで社内IPアドレスのみからdocker loginを可能にしております。
{ "Version": "2012-10-17", "Statement": [ { "Condition": { "IpAddress": { "aws:SourceIp": [ # ここに社内IP ] } }, "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ], "Resource": [ "arn:aws:ecr:ap-northeast-1:<account-id>:repository/<prefix>-*" ], "Effect": "Allow" } ] }
まとめ
AWS Chatbotでも似たようなことはできますが、ワークフローが複雑になる点等を考慮して今回slackbotを作ってみました。今の所大きなトラブルなく利用できています。
引き続きやっていきます!一緒にSREグループを盛り上げていただける方を募集しております!!!