Solution 1:

You shouldn't be using the elastic IP, it's public and you'll be charged internet traffic rates, whereas internal traffic is free.

Instances keep their IP on restart, but it can change on stop / start. However I have one instance on a subnet that has been stopped and started many times and has kept the same private IP.

The best solution, I think, is to use an ENI (Elastic Network Interface). You can create an ENI and specify a private fixed IP address, which you can do from the API or console. You then attach your ENI to your EC2 instance, and there may be some fiddling around to get the OS / software to recognise it, but I imagine you can search for that.

enter image description here

You could just put the NFS instance in the same subnet as the EC2 instances, but if the EC2 instances are public web server that's less secure than using a DMZ.