Hi.
You want to connect two clients. One has public IP address and another one is behind NAT.
In this case you really don't need any STUN, TURN or ICE. You can simply write a c app to send receive. Even if you are using browser, you don't need WebRTC library, you can just use Websocket to send receive.
Even if one client has public IP it is not a matter what the NAT type of other client. It may be symmetric NAT or anything.
>>The question is can I circumvent all that unnecessary and rather flaky complexity of NAT hole punching and TURN and just generate my own ICE candidate pointing to the public IP and port of the sender? And configure the sender that it doesn't do any ICE, just listen on >>a particular port?
Why not. You can do it. As you are developing the app, you can change in the app code and in the library and do it.
The main issue here, you are using EC2 instance with public IP address which is not a real public IP address. It is a NATed public IP address. Coturn needs some specific configuration to work with it and Client must use STUN server to discover it external IP address.
But certainly no TURN server is required here.
Thanks,
Shakeeb