There are many approaches to this, of the somewhat more common and simple you can either:
(1) use a user_data
script that will bootstrap the EC2 instance for you
A sample user_data
script might look like below. Borrowed from github/gonzaloplaza.
#!/bin/bash
# Install docker
apt-get update
apt-get install -y cloud-utils apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
apt-get update
apt-get install -y docker-ce
usermod -aG docker ubuntu
# Install docker-compose
curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
And then embed it in your Terraform EC2 instance definition:
resource "aws_instance" "my-instance" {
ami = "ami-05210ba6bdf75db36" # Ubuntu 20.04LTS eu-central-1
instance_type = "m5.large"
key_name = "<key-path>"
user_data = "${file("install_docker.sh")}"
tags = {
Name = "Terraform"
}
}
(2) or use an AMI (virtual image) that has the requirement already met. AWS Marketplace
enables you to use AMIs that other users built. You can check out for example Docker on Ubuntu
AWS Marketplace link.
(3) And a more complex approach would be to build your own AMIs with for example Puppet and Packer. You can then upload those AMIs to your AWS Account and use with the instances you create.
References
Ubuntu AMI Locator for the Ubuntu 20.04LTS eu-central-1
AMI
github/gonzaloplaza for the userscript
example