概要
最近途中から参画した案件でawsのlambdaを使うことがあったのですが、今まで経験がなかったため備忘録としてまとめます。
ざっくりした内容としては表題の通り、lambda関数にイメージがデプロイされていた場合、どのような手順で内容を編集し、更新するのかについてとなります。
前提
- Dockerの環境構築済み
- AWS CLIの環境構築済み
- 既存のlambda関数、イメージが存在する
- 既存リソースの更新であり、新規作成ではない
手順
ECR, docker のログイン
AWSにおいてイメージはECR(Elastic Container Registry)で管理されます。そのため、外部からイメージを取得するには、ログインしておく必要があります。
aws ecr get-login-password --region YOUR_REGION | docker login --username AWS --password-stdin YOUR_ACCOUNT_ID.dkr.ecr.YOUR_REGION.amazonaws.com
以下の項目については、各自該当するものに修正してください。
- YOUR_REGION:東京であれば"ap-northeast-1"となります。
- YOUR_ACCOUNT_ID:AWSマネジメントコンソールの右上にある「ユーザー@●●●●」をクリックすると、アカウントIDが表示されます。
イメージの取得とコンテナの起動
ログイン完了後、編集予定のイメージをローカルに落とし、コンテナを起動します。
docker pull IMAGE_URI #イメージの取得
docker run -it --entrypoint /bin/sh IMAGE_URI #コンテナの起動
※イメージは既存のエントリーポイントを持ちますが、上記コマンドではコンテナ内のエントリーポイントを指定しているだけであるため、イメージ側が更新されるわけではない。
コードの編集
CUIでの編集となるため、linuxコマンドを使用することになります。
コマンドやファイルの編集方法は以下を参照してみてください。基本的な操作になるため、もっと深く知りたい方は調べてみてください。
イメージの更新
コードの編集が終わったらECRのイメージを更新する必要があります。
docker commit CONTAINER_ID IMAGE_NAME
docker push IMAGE_NAME
- CONTAINER_ID:これはローカルで編集していたコンテナのIDになります。確認方法としては
docker ps -a
などを実行し、出力結果のCONTAINER IDを持ってきてください。 - IMAGE_NAME:例えばIMAGE_URIがxxx/xxx:latestとなっていた場合、xxx/xxx部分だけを使用してください。
lambda関数の更新
イメージの更新が終わったら、更新後のイメージをlambdaで利用するように設定します。
まずは、コードのみを更新し、その後設定を更新します。(一般的にコード更新->設定更新の順)
aws lambda update-function-code --function-name LAMBDA_FUNCTION_NAME --image-uri IMAGE_URI
- LAMBDA_FUNCTION_NAME:更新したいlambda関数名
- IMAGE_URI:タグを指定していない場合、"IMAGE_NAME:latest"とする
次に、設定の更新になります。ここでの設定とは例えば以下のようなものが挙げられます。
- メモリ割り当て
- タイムアウト
- 環境変数
- IAMロール
- VPC設定
- ランタイム
以下のコードではメモリとタイムアウトだけ更新しています。
aws lambda update-function-configuration --function-name LAMBDA_FUNCTION_NAME --timeout 900 --memory-size 512
- LAMBDA_FUNCTION_NAME:上と同様
lambda関数の更新に利用するそれぞれのコードは実行に時間がかかります。
コードの更新中に設定の更新を行うとエラーになる点には注意してください。
各更新が終わったのかは以下のコードで確かめることができます。
aws lambda get-function-configuration --function-name LAMBDA_FUNCTION_NAME
last_update_status
という項目がSuccessful
となっていれば実行が完了しています。