事象
codepipelineから「変更をリリース」したところ、CodeDeployでコケた。
エラー
2021-06-16 09:47:03 ERROR [codedeploy-agent(2559)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Error during perform: Errno::ENOMEM - Cannot allocate memory - rm -rf /opt/codedeploy-agent/deployment-root/b59fab18-5d0f-41bf-92e8-60410f9c6597/d-HCQHTD03B 2>&1 - /opt/codedeploy-agent/lib/instance_agent/platform/linux_util.rb:95:in
メモリを割り当てられないらしい。
原因
デプロイ先のEC2インスタンスのメモリが80%を超えていた。
プロセスのメモリ使用率の割合を調べてみると、CodeDeployエージェントが異常にメモリ使っていた。53.8%
ps aux --sort -rss
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2559 0.0 53.8 1508016 1098544 ? Sl 5月13 23:05 codedeploy-agent: InstanceAgent::Plugins::CodeDepl
対応
CodeDeployエージェント再起動をすることでメモリ使用率が53.8%から2.7%になった。
今後の対応
CodeDeployエージェント再起動後にCodeDeploy実行を複数回行い、プロセスのメモリ使用率の上り具合を確認する。
codedeployエージェントメモリ使用率: 2.7 → 13.6 → 22.1 → 22.2 → 23.0 → 23.5 → 25.2 ...
結果
CodeDeploy実行する度にプロセスのメモリ使用率が大きく上がっていくことがわかった。
現状、定期的にCodeDeployエージェントの再起動を行わなければ、今回のようにメモリを割り当てられなくなり、CodeDeploy実行時にエラーになる。
こちらの参考サイトを元に以下対応
https://github.com/aws/aws-codedeploy-agent/issues/32
対応1
参考サイトによると、デプロイメントバンドルの解凍に使用されているサードパーティのメモリ内ライブラリが原因。unzip
がインストールされていればメモリ使用量を小さくすることが出来るらしい。
しかし当サーバーではunzipはインストール済みだった。
確認コマンドyum info unzip
対応2
参考サイトによると、根本解決ではないが以下で回避はできる。
appspec.ymlファイルのValidateServiceフックから実行されるスクリプトにCodeDeployエージェントの再起動をスケジュールする行を追加
at -M now + 2 minute <<< $'service codedeploy-agent restart'
処理内容:CodeDeploy実行の2分後にCodeDeployエージェントの再起動を行う。
(atコマンドのオプション-M
に関して探しても出てこなかったのでつけないで設定)
appspec.yml (編集)
version: 0.0
os: linux
files:
- source: src
destination: /var/www/html/
permissions:
- object: /var/www/html
owner: apache
group: apache
hooks:
ValidateService: // 追加
- location: deploy/codedeploy-restart.sh // 追加
runas: root
deploy/codedeploy-restart.sh (新規作成)
at now + 2 minute <<< $'service codedeploy-agent restart'
動作確認
CodeDeployログでシェルが実行されていることを確認
less /opt/codedeploy-agent/deployment-root/deployment-logs
[2021-06-16 14:49:04.709] [d-N7S12UG4B]Script - deploy/codedeploy-restart.sh
複数回デプロイを実行してCodeDeployエージェントのメモリ使用率が上がらないことを確認
ps aux --sort -rss
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 16779 0.2 2.7 331548 55792 ? SNl 14:52 0:00 codedeploy-agent: InstanceAgent::Plugins::CodeDeploy