186 lines
6.8 KiB
Markdown
186 lines
6.8 KiB
Markdown
---
|
||
title: Pulumi for Terraform Users
|
||
layout: terraform
|
||
url: /terraform
|
||
meta_image: /images/migrate/oss-meta.png
|
||
|
||
|
||
benefits:
|
||
title: The benefits of using Pulumi
|
||
items:
|
||
- title: Committed to open source
|
||
icon: exchange
|
||
icon_color: yellow
|
||
description: |
|
||
Pulumi is fully open source and is Apache 2.0 licensed. It does not and never will depend on Business Source License software in any way.
|
||
|
||
- title: Tame cloud complexity
|
||
icon: code-window
|
||
icon_color: salmon
|
||
description: |
|
||
Deliver infrastructure from 100+ cloud and SaaS providers. Pulumi’s SDKs provide a complete and consistent interface that offers full access to
|
||
clouds and abstracts complexity.
|
||
|
||
- title: Bring the cloud closer to application development
|
||
icon: download-from-cloud
|
||
icon_color: violet
|
||
description: |
|
||
Build reusable cloud infrastructure and infrastructure platforms that empower
|
||
developers to build modern cloud applications faster and with less overhead.
|
||
|
||
- title: Use engineering practices with infrastructure
|
||
icon: lightning
|
||
icon_color: blue
|
||
description: |
|
||
Use engineering practices with infrastructure to replace inefficient, manual infrastructure processes with automation.
|
||
Test and deliver infrastructure through CI/CD workflows or automate deployments with code at runtime.
|
||
|
||
meta_desc: How to migrate to Pulumi from Terraform for huge productivity gains, and a unified programming model for Devs and DevOps.
|
||
hero_form:
|
||
hubspot_form_id: 123cfbdb-9ce4-4d33-a9b7-c30302463d7a
|
||
headline: Need help converting?
|
||
contact_us_form:
|
||
section_id: contact-us
|
||
hubspot_form_id: 123cfbdb-9ce4-4d33-a9b7-c30302463d7a
|
||
headline: Need assistance?
|
||
quote:
|
||
title: See how top engineering teams enable developers and operators to work better together with Pulumi.
|
||
name: Kim Hamilton
|
||
name_title: CTO, Learning Machine
|
||
content: |
|
||
Pulumi has given our team the tools and framework to achieve a unified development and DevOps model,
|
||
boosting productivity and taking our business to any cloud environment that our customers need. We
|
||
retired 25,000 lines of complex code that few team members understood and replaced it with 100s of
|
||
lines in a familiar programming language.
|
||
examples:
|
||
one:
|
||
ts: |
|
||
import * as aws from "@pulumi/aws";
|
||
import { readdirSync } from "fs";
|
||
import { join as pathjoin } from "path";
|
||
|
||
const bucket = new aws.s3.Bucket("mybucket");
|
||
const folder = "./files";
|
||
let files = readdirSync(folder);
|
||
|
||
for (let file of files) {
|
||
const object = new aws.s3.BucketObject(file, {
|
||
bucket: bucket,
|
||
source: new pulumi.FileAsset(pathjoin(folder, file))
|
||
});
|
||
}
|
||
|
||
export const bucketname = bucket.id;
|
||
tf: |
|
||
resource "aws_s3_bucket" "mybucket" {
|
||
bucket_prefix = "mybucket"
|
||
}
|
||
|
||
resource "aws_s3_bucket_object" "data_txt" {
|
||
key = "data.txt"
|
||
bucket = "${aws_s3_bucket.mybucket.id}"
|
||
source = "./files/data.txt"
|
||
}
|
||
|
||
resource "aws_s3_bucket_object" "index_html" {
|
||
key = "index.html"
|
||
bucket = "${aws_s3_bucket.mybucket.id}"
|
||
source = "./files/index.html"
|
||
}
|
||
|
||
resource "aws_s3_bucket_object" "index_js" {
|
||
key = "index.js"
|
||
bucket = "${aws_s3_bucket.mybucket.id}"
|
||
source = "./files/index.js"
|
||
}
|
||
|
||
resource "aws_s3_bucket_object" "main.css" {
|
||
key = "main.css"
|
||
bucket = "${aws_s3_bucket.mybucket.id}"
|
||
source = "./files/main.css"
|
||
}
|
||
|
||
resource "aws_s3_bucket_object" "favicon.ico" {
|
||
key = "favicon.ico"
|
||
bucket = "${aws_s3_bucket.mybucket.id}"
|
||
source = "./files/favicon.ico"
|
||
}
|
||
two:
|
||
ts: |
|
||
import * as aws from "@pulumi/aws";
|
||
|
||
// Create an S3 Bucket.
|
||
const bucket = new aws.s3.Bucket("mybucket");
|
||
|
||
// Register a Lambda to handle the Bucket notification.
|
||
bucket.onObjectCreated("newObj", async (ev, ctx) => {
|
||
// Write code inline, or use a Zip
|
||
console.log(JSON.stringify(ev));
|
||
});
|
||
|
||
// Export the bucket name for easy scripting.
|
||
export const bucketName = bucket.id;
|
||
tf: |
|
||
resource "aws_s3_bucket" "mybucket" {
|
||
bucket_prefix = "mybucket"
|
||
}
|
||
|
||
data "archive_file" "lambda_zip" {
|
||
type = "zip"
|
||
output_path = "lambda.zip"
|
||
|
||
source {
|
||
filename = "index.js"
|
||
content = < {
|
||
console.log(JSON.stringify(ev))
|
||
}
|
||
EOF
|
||
}
|
||
}
|
||
|
||
data "aws_iam_policy_document" "lambda-assume-role-policy" {
|
||
statement {
|
||
actions = ["sts:AssumeRole"]
|
||
|
||
principals {
|
||
type = "Service"
|
||
identifiers = ["lambda.amazonaws.com"]
|
||
}
|
||
}
|
||
}
|
||
|
||
resource "aws_iam_role" "lambda" {
|
||
assume_role_policy = "${data.aws_iam_policy_document.lambda-assume-role-policy.json}"
|
||
}
|
||
|
||
resource "aws_lambda_function" "my_lambda" {
|
||
filename = "${data.archive_file.lambda_zip.output_path}"
|
||
source_code_hash = "${data.archive_file.lambda_zip.output_base64sha256}"
|
||
function_name = "my_lambda"
|
||
role = "${aws_iam_role.lambda.arn}"
|
||
handler = "index.handler"
|
||
runtime = "nodejs8.10"
|
||
}
|
||
|
||
resource "aws_lambda_permission" "allow_bucket" {
|
||
statement_id = "AllowExecutionFromS3Bucket"
|
||
action = "lambda:InvokeFunction"
|
||
function_name = "${aws_lambda_function.my_lambda.arn}"
|
||
principal = "s3.amazonaws.com"
|
||
source_arn = "${aws_s3_bucket.mybucket.arn}"
|
||
}
|
||
|
||
resource "aws_s3_bucket_notification" "bucket_notification" {
|
||
bucket = "${aws_s3_bucket.mybucket.id}"
|
||
|
||
lambda_function {
|
||
lambda_function_arn = "${aws_lambda_function.my_lambda.arn}"
|
||
events = ["s3:ObjectCreated:*"]
|
||
}
|
||
}
|
||
|
||
output "bucket_name" {
|
||
value = "${aws_s3_bucket.mybucket.id}"
|
||
}
|
||
---
|