A Pulumi package for creating and managing Amazon Web Services (AWS) cloud resources with infrastructure-as-code.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Amazon EC2 provides resizable compute capacity in the cloud. It includes virtual servers (instances), networking (VPCs, subnets, security groups), storage (EBS volumes), and related infrastructure.
const webServer = new aws.ec2.Instance("web", {
ami: "ami-0c55b159cbfafe1f0",
instanceType: "t3.micro",
subnetId: subnet.id,
vpcSecurityGroupIds: [sg.id],
userData: `#!/bin/bash
echo "Hello, World!" > /var/www/html/index.html`,
tags: { Name: "web-server" },
});const vpc = new aws.ec2.Vpc("main", {
cidrBlock: "10.0.0.0/16",
enableDnsHostnames: true,
enableDnsSupport: true,
});
const subnet = new aws.ec2.Subnet("public", {
vpcId: vpc.id,
cidrBlock: "10.0.1.0/24",
mapPublicIpOnLaunch: true,
});const webSg = new aws.ec2.SecurityGroup("web", {
vpcId: vpc.id,
ingress: [
{ protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] },
{ protocol: "tcp", fromPort: 443, toPort: 443, cidrBlocks: ["0.0.0.0/0"] },
],
egress: [{ protocol: "-1", fromPort: 0, toPort: 0, cidrBlocks: ["0.0.0.0/0"] }],
});Launch and manage EC2 virtual machine instances.
class Instance extends pulumi.CustomResource {
constructor(name: string, args: InstanceArgs, opts?: pulumi.CustomResourceOptions);
readonly ami: pulumi.Output<string>;
readonly instanceType: pulumi.Output<string>;
readonly publicIp: pulumi.Output<string>;
readonly privateIp: pulumi.Output<string>;
readonly id: pulumi.Output<string>;
readonly arn: pulumi.Output<string>;
}
interface InstanceArgs {
ami: pulumi.Input<string>;
instanceType: pulumi.Input<string>;
subnetId?: pulumi.Input<string>;
vpcSecurityGroupIds?: pulumi.Input<pulumi.Input<string>[]>;
keyName?: pulumi.Input<string>;
userData?: pulumi.Input<string>;
iamInstanceProfile?: pulumi.Input<string>;
tags?: pulumi.Input<{[key: string]: pulumi.Input<string>}>;
monitoring?: pulumi.Input<boolean>;
ebsOptimized?: pulumi.Input<boolean>;
rootBlockDevice?: pulumi.Input<InstanceRootBlockDevice>;
ebsBlockDevices?: pulumi.Input<pulumi.Input<InstanceEbsBlockDevice>[]>;
}
interface InstanceRootBlockDevice {
volumeType?: pulumi.Input<string>;
volumeSize?: pulumi.Input<number>;
iops?: pulumi.Input<number>;
throughput?: pulumi.Input<number>;
deleteOnTermination?: pulumi.Input<boolean>;
encrypted?: pulumi.Input<boolean>;
kmsKeyId?: pulumi.Input<string>;
}
interface InstanceEbsBlockDevice {
deviceName: pulumi.Input<string>;
volumeType?: pulumi.Input<string>;
volumeSize?: pulumi.Input<number>;
iops?: pulumi.Input<number>;
throughput?: pulumi.Input<number>;
deleteOnTermination?: pulumi.Input<boolean>;
encrypted?: pulumi.Input<boolean>;
kmsKeyId?: pulumi.Input<string>;
snapshotId?: pulumi.Input<string>;
}Usage Example:
// Query latest Amazon Linux AMI
const ami = await aws.ec2.getAmi({
mostRecent: true,
owners: ["amazon"],
filters: [{ name: "name", values: ["amzn2-ami-hvm-*-x86_64-gp2"] }],
});
// Launch instance with custom root volume
const instance = new aws.ec2.Instance("web-server", {
ami: ami.id,
instanceType: "t3.micro",
subnetId: subnet.id,
vpcSecurityGroupIds: [sg.id],
rootBlockDevice: {
volumeType: "gp3",
volumeSize: 20,
encrypted: true,
},
userData: `#!/bin/bash
echo "Hello, World!" > /var/www/html/index.html
yum install -y httpd
systemctl start httpd
`,
tags: { Name: "web-server" },
});
export const instanceIp = instance.publicIp;Create Virtual Private Clouds for network isolation.
class Vpc extends pulumi.CustomResource {
constructor(name: string, args: VpcArgs, opts?: pulumi.CustomResourceOptions);
readonly id: pulumi.Output<string>;
readonly cidrBlock: pulumi.Output<string>;
readonly arn: pulumi.Output<string>;
}
interface VpcArgs {
cidrBlock: pulumi.Input<string>;
enableDnsHostnames?: pulumi.Input<boolean>;
enableDnsSupport?: pulumi.Input<boolean>;
tags?: pulumi.Input<{[key: string]: pulumi.Input<string>}>;
}Usage Example:
const vpc = new aws.ec2.Vpc("my-vpc", {
cidrBlock: "10.0.0.0/16",
enableDnsHostnames: true,
enableDnsSupport: true,
tags: { Name: "main-vpc" },
});Create subnets within VPCs.
class Subnet extends pulumi.CustomResource {
constructor(name: string, args: SubnetArgs, opts?: pulumi.CustomResourceOptions);
readonly id: pulumi.Output<string>;
readonly vpcId: pulumi.Output<string>;
readonly cidrBlock: pulumi.Output<string>;
readonly availabilityZone: pulumi.Output<string>;
}
interface SubnetArgs {
vpcId: pulumi.Input<string>;
cidrBlock: pulumi.Input<string>;
availabilityZone?: pulumi.Input<string>;
mapPublicIpOnLaunch?: pulumi.Input<boolean>;
tags?: pulumi.Input<{[key: string]: pulumi.Input<string>}>;
}Usage Example:
const subnet = new aws.ec2.Subnet("my-subnet", {
vpcId: vpc.id,
cidrBlock: "10.0.1.0/24",
availabilityZone: "us-west-2a",
mapPublicIpOnLaunch: true,
tags: { Name: "public-subnet" },
});Manage firewall rules for instances.
class SecurityGroup extends pulumi.CustomResource {
constructor(name: string, args: SecurityGroupArgs, opts?: pulumi.CustomResourceOptions);
readonly id: pulumi.Output<string>;
readonly vpcId: pulumi.Output<string>;
}
interface SecurityGroupArgs {
vpcId?: pulumi.Input<string>;
description?: pulumi.Input<string>;
ingress?: pulumi.Input<pulumi.Input<SecurityGroupRule>[]>;
egress?: pulumi.Input<pulumi.Input<SecurityGroupRule>[]>;
tags?: pulumi.Input<{[key: string]: pulumi.Input<string>}>;
}
interface SecurityGroupRule {
fromPort: pulumi.Input<number>;
toPort: pulumi.Input<number>;
protocol: pulumi.Input<string>;
cidrBlocks?: pulumi.Input<pulumi.Input<string>[]>;
securityGroups?: pulumi.Input<pulumi.Input<string>[]>;
description?: pulumi.Input<string>;
}Usage Example:
const sg = new aws.ec2.SecurityGroup("web-sg", {
vpcId: vpc.id,
description: "Allow HTTP/HTTPS traffic",
ingress: [
{
protocol: "tcp",
fromPort: 80,
toPort: 80,
cidrBlocks: ["0.0.0.0/0"],
description: "HTTP"
},
{
protocol: "tcp",
fromPort: 443,
toPort: 443,
cidrBlocks: ["0.0.0.0/0"],
description: "HTTPS"
},
],
egress: [
{ protocol: "-1", fromPort: 0, toPort: 0, cidrBlocks: ["0.0.0.0/0"] },
],
tags: { Name: "web-security-group" },
});Manage Amazon Machine Images.
class Ami extends pulumi.CustomResource {
constructor(name: string, args: AmiArgs, opts?: pulumi.CustomResourceOptions);
}
interface AmiArgs {
name: pulumi.Input<string>;
description?: pulumi.Input<string>;
architecture?: pulumi.Input<string>;
rootDeviceName?: pulumi.Input<string>;
virtualizationType?: pulumi.Input<string>;
}Manage SSH key pairs for instance access.
class KeyPair extends pulumi.CustomResource {
constructor(name: string, args?: KeyPairArgs, opts?: pulumi.CustomResourceOptions);
}
interface KeyPairArgs {
keyName?: pulumi.Input<string>;
publicKey?: pulumi.Input<string>;
tags?: pulumi.Input<{[key: string]: pulumi.Input<string>}>;
}The ec2 module includes 50+ networking resources. Key ones include:
Query existing EC2 resources.
function getAmi(args: GetAmiArgs): Promise<GetAmiResult>;
function getInstance(args: GetInstanceArgs): Promise<GetInstanceResult>;
function getVpc(args: GetVpcArgs): Promise<GetVpcResult>;
function getSubnet(args: GetSubnetArgs): Promise<GetSubnetResult>;
function getSecurityGroup(args: GetSecurityGroupArgs): Promise<GetSecurityGroupResult>;Usage Example:
import * as aws from "@pulumi/aws";
// Query AMI
const ami = await aws.ec2.getAmi({
mostRecent: true,
owners: ["amazon"],
filters: [{ name: "name", values: ["amzn2-ami-hvm-*-x86_64-gp2"] }],
});
// Create VPC and subnet
const vpc = new aws.ec2.Vpc("my-vpc", {
cidrBlock: "10.0.0.0/16",
enableDnsHostnames: true,
enableDnsSupport: true,
});
const subnet = new aws.ec2.Subnet("my-subnet", {
vpcId: vpc.id,
cidrBlock: "10.0.1.0/24",
mapPublicIpOnLaunch: true,
});
// Create security group
const sg = new aws.ec2.SecurityGroup("web-sg", {
vpcId: vpc.id,
ingress: [
{ protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] },
{ protocol: "tcp", fromPort: 443, toPort: 443, cidrBlocks: ["0.0.0.0/0"] },
],
egress: [
{ protocol: "-1", fromPort: 0, toPort: 0, cidrBlocks: ["0.0.0.0/0"] },
],
});
// Launch instance
const instance = new aws.ec2.Instance("web-server", {
ami: ami.id,
instanceType: "t3.micro",
subnetId: subnet.id,
vpcSecurityGroupIds: [sg.id],
userData: `#!/bin/bash
echo "Hello, World!" > /var/www/html/index.html
yum install -y httpd
systemctl start httpd
`,
tags: { Name: "web-server" },
});
export const instanceIp = instance.publicIp;For complete resource list (105 resources, 64 data sources), see the All Services Index.
Install with Tessl CLI
npx tessl i tessl/npm-pulumi--aws@7.16.0