AWS CodeDeployでVPCエンドポイントを使用する場合は一手間必要なのでその辺のネタを。
今時だと大抵のEC2インスタンスはプライベートサブネットに配置されているので、VPC外に通信する場合はNATゲートウェイ・プロキシ・VPCエンドポイントいずれかを通って出ていくことになる。最初の2つは気にしなくていいのだが、VPCエンドポイントの場合は別途追加対応が必要なのである。
事象
codedeploy-agentが再起動を繰り返していて、こんなエラーを吐いていた。
Errorno:: ENETUNREACH - Failed to open TCP connection to 169.254.169.254:80 (Network is unreachble …
ERROR [codedeploy-agent(2100)]: booting child: error during start or run: SystemExit - exit - …
さらに、cloudwatch-agentのログにもこんなエラーが大量の吐き出されていた。codedeployのログよりこっちの方がすごかった。
ERROR [codedeploy-agent(4492)]:Error validating the SSL configuration: Invalid server certificate (snip)
ERROR [codedeploy-agent(2100)]: booting child: error during start or run: SystemExit - Stopping CodeDeploy agent due to SSL validation error. (snip)
メッセージから見ると通信に失敗しているのは明らかなのだが、別環境の検証時は問題なく動いていた。しかしその時はNATゲートウェイを使用していた。VPCエンドポイントに切り替えた環境で、上記エラーが発生したのだ。
やったこと
調べた結果、追加で以下の設定が必要と判明。
codedeployagent.yml
:enable_auto_policy:true #デフォルトはfalse
ファイルパス
Linux: /etc/codedeploy-agent/conf/codedeployagent.yml
Windows: C:¥ProgramData¥Amazon¥CodeDeploy¥conf.yml
これで起動状態は正常になってエラーも解消した。しかし、追加のIAMポリシーがないとデプロイ時に権限が足りないと怒られて失敗する。エージェントが動作するEC2にアタッチしているIAMロールに、以下の権限が必要なのである。
{
"Statement": [
{
"Action": [
"codedeploy-commands-secure:GetDeploymentSpecification",
"codedeploy-commands-secure:PollHostCommand",
"codedeploy-commands-secure:PutHostCommandAcknowledgement",
"codedeploy-commands-secure:PutHostCommandComplete"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
対象IAMロールに上記ポリシー追加後、デプロイが成功した。ネットワーク環境の違いって何かと影響でかいんだよな…、まぁそんなに疲れるネタじゃなかったからいいけど。
オマケ:CodeDeployのエンドポイントと疎通確認するには以下コマンドで。
$ curl -v https://codedeploy-commands.ap-northeast-1.amazon.com
参考
CodeDeployエージェント構成リファレンス
Amazon Virtual Private Cloud で CodeDeploy を使用
【AWSの呼吸 弐ノ型】CodeDeployでVPCエンドポイントを設定する