This is a very handy trick to get your own public IP within Terrafrom. Very useful if your public IP changes a lot and you want to use it with a security group.

provider "aws" {
  region = "eu-west-1"
}

data "external" "myipaddr" {
  program = ["bash", "-c", "curl -s 'https://ipinfo.io/json'"]
}

output "my_public_ip" {
  value = "${data.external.myipaddr.result.ip}"
}

The simply run terrafrom init to download your provider and then terrafrom apply to run.

The output is below, I have changed the IP for security reasons.

data.external.myipaddr: Refreshing state...

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

my_public_ip = 8.8.8.8