55
AWS CloudFormation Michel Pereira Solutions Architect [email protected]

Programando sua infraestrutura com o AWS CloudFormation

Embed Size (px)

DESCRIPTION

Programando sua infraestrutura com o AWS CloudFormation, por Michel Pereir, Solutions Architect da AWS.

Citation preview

Page 1: Programando sua infraestrutura com o AWS CloudFormation

AWS CloudFormation

Michel PereiraSolutions Architect

[email protected]

Page 2: Programando sua infraestrutura com o AWS CloudFormation

AWS CloudFormation

• AWS CloudFormation dá aos desenvolvedores e administradores de sistemas uma maneira fácil de criar e gerenciar recursos da AWS, provisionando e atualizando a infra-estrutura de uma maneira ordenada e previsível.

Page 3: Programando sua infraestrutura com o AWS CloudFormation

AWS CloudFormation

Templates para descrever os recursos da AWS e qualquer dependência relacionada ou parâmetros requiridos para executar a

sua aplicação

Page 4: Programando sua infraestrutura com o AWS CloudFormation

AWS CloudFormation

Você não precisa descobrir a ordem em qual os serviços precisam ser

provisionados ou como fazer essas dependências funcionarem.

Page 5: Programando sua infraestrutura com o AWS CloudFormation

AWS CloudFormation

Uma vez executado, você pode modificar e atualizar os recursos de uma maneira controlada e previsível, permitido você

versionar a sua infraestrutura do mesmo jeito que você faz com o seu código

Page 6: Programando sua infraestrutura com o AWS CloudFormation

AWS CloudFormation

AWS CloudFormation é gratuito e você só paga pelos recursos que serão utilizados

pelo seu aplicativo.

Page 7: Programando sua infraestrutura com o AWS CloudFormation

AWS CloudFormation

• Templates que descrevem os recursos da AWS

• Modifique e atualize os seus recursos AWS de uma maneira controlada e previsível.

• Tenha controle de versão da sua infraestrutura na AWS

Page 8: Programando sua infraestrutura com o AWS CloudFormation

AWS CloudFormation

Consegue fazer

em um datacenter

físico?

Page 9: Programando sua infraestrutura com o AWS CloudFormation

Anatomiade um template

Page 10: Programando sua infraestrutura com o AWS CloudFormation

JSON

Page 11: Programando sua infraestrutura com o AWS CloudFormation

JSON

Texto puro

Perfeito para controle de

versão

Pode ser validado

Page 12: Programando sua infraestrutura com o AWS CloudFormation

Linguagem declarativa

Page 13: Programando sua infraestrutura com o AWS CloudFormation

{

"AWSTemplateFormatVersion" : "2010-09-09",

"Description" : "AWS CloudFormation Sample Template EC2InstanceSample: Create an Amazon EC2 instance running the Amazon Linux AMI. The AMI is chosen based on the region in which the stack is run. This example uses the default security group, so to SSH to the new instance using the KeyPair you enter, you will need to have port 22 open in your default security group. **WARNING** This template an Amazon EC2 instances. You will be billed for the AWS resources used if you create a stack from this template.",

"Parameters" : { "KeyName" : { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance", "Type" : "String" } },

"Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-7f418316" }, "us-west-1" : { "AMI" : "ami-951945d0" }, "us-west-2" : { "AMI" : "ami-16fd7026" }, "eu-west-1" : { "AMI" : "ami-24506250" }, "sa-east-1" : { "AMI" : "ami-3e3be423" }, "ap-southeast-1" : { "AMI" : "ami-74dda626" }, "ap-northeast-1" : { "AMI" : "ami-dcfa4edd" } } },

"Resources" : { "Ec2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "KeyName" : { "Ref" : "KeyName" }, "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}, "UserData" : { "Fn::Base64" : "80" } } } },

"Outputs" : { "InstanceId" : { "Description" : "InstanceId of the newly created EC2 instance", "Value" : { "Ref" : "Ec2Instance" } }, "AZ" : { "Description" : "Availability Zone of the newly created EC2 instance", "Value" : { "Fn::GetAtt" : [ "Ec2Instance", "AvailabilityZone" ] } },

Page 14: Programando sua infraestrutura com o AWS CloudFormation

"AWSTemplateFormatVersion" : "2010-09-09",

"Description" : "AWS CloudFormation Sample Template EC2InstanceSample: Create an Amazon EC2 instance running the Amazon Linux AMI. The AMI is chosen based on the region in which the stack is run. This example uses the default security group, so to SSH to the new instance using the KeyPair you enter, you will need to have port 22 open in your default security group. **WARNING** This template an Amazon EC2 instances. You will be billed for the AWS resources used if you create a stack from this template.",

"Parameters" : { "KeyName" : { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance", "Type" : "String" } },

"Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-7f418316" }, "us-west-1" : { "AMI" : "ami-951945d0" }, "us-west-2" : { "AMI" : "ami-16fd7026" }, "eu-west-1" : { "AMI" : "ami-24506250" }, "sa-east-1" : { "AMI" : "ami-3e3be423" }, "ap-southeast-1" : { "AMI" : "ami-74dda626" }, "ap-northeast-1" : { "AMI" : "ami-dcfa4edd" } } },

"Resources" : { "Ec2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "KeyName" : { "Ref" : "KeyName" }, "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}, "UserData" : { "Fn::Base64" : "80" } } } },

"Outputs" : { "InstanceId" : { "Description" : "InstanceId of the newly created EC2 instance", "Value" : { "Ref" : "Ec2Instance" } }, "AZ" : { "Description" : "Availability Zone of the newly created EC2 instance", "Value" : { "Fn::GetAtt" : [ "Ec2Instance", "AvailabilityZone" ] } },…..

CabeçalhoParâmetros

Mapeamentos

Recursos

Saídas

Page 15: Programando sua infraestrutura com o AWS CloudFormation

ParâmetrosConfigurações em tempo

de provisionamento

Page 16: Programando sua infraestrutura com o AWS CloudFormation
Page 17: Programando sua infraestrutura com o AWS CloudFormation

Mapeamentos

Condições

Page 18: Programando sua infraestrutura com o AWS CloudFormation
Page 19: Programando sua infraestrutura com o AWS CloudFormation
Page 20: Programando sua infraestrutura com o AWS CloudFormation

Recursos

Page 21: Programando sua infraestrutura com o AWS CloudFormation
Page 22: Programando sua infraestrutura com o AWS CloudFormation
Page 23: Programando sua infraestrutura com o AWS CloudFormation
Page 24: Programando sua infraestrutura com o AWS CloudFormation

Parâmetro

de referência

“KeyName” : { “Ref” : “KeyName” },

Page 25: Programando sua infraestrutura com o AWS CloudFormation
Page 26: Programando sua infraestrutura com o AWS CloudFormation

Mapeamento

condicional

“ImageId” : { “Fn::FindInMap” : [ “RegionMap”, { “Ref” : “AWS::Region” }, “AMI” ]},

Page 27: Programando sua infraestrutura com o AWS CloudFormation

Nome

do mapa

“ImageId” : { “Fn::FindInMap” : [ “RegionMap”, { “Ref” : “AWS::Region” }, “AMI” ]},

Page 28: Programando sua infraestrutura com o AWS CloudFormation

Referência

de propriedade

declarada

“ImageId” : { “Fn::FindInMap” : [ “RegionMap”, { “Ref” : “AWS::Region” }, “AMI” ]},

Page 29: Programando sua infraestrutura com o AWS CloudFormation

Saídas

Page 30: Programando sua infraestrutura com o AWS CloudFormation
Page 31: Programando sua infraestrutura com o AWS CloudFormation

Recursos: Quase todos os serviços AWS– O que está faltando (até agora)?

• Amazon Elastic MapReduce (EMR)

• Amazon Simple Workflow Service (SWF)• Amazon Simple Email Service (SES)• Amazon Glacier• Amazon CloudSearch• Pequenas novidades de outros serviços ainda não

implementadas

AWS CloudFormation

Page 32: Programando sua infraestrutura com o AWS CloudFormation

Recursos – Amazon Elastic Compute Cloud (EC2):{

"Type" : "AWS::EC2::Instance",

"Properties" : {

"AvailabilityZone" : String,

"DisableApiTermination" : Boolean,

"EbsOptimized" : Boolean,

"IamInstanceProfile" : String,

"ImageId" : String,

"InstanceType" : String,

AWS CloudFormation

Page 33: Programando sua infraestrutura com o AWS CloudFormation

Recursos – Amazon EC2:– "KernelId" : String,

– "KeyName" : String,– "Monitoring" : Boolean,– "PlacementGroupName" : String,– "PrivateIpAddress" : String,– "RamdiskId" : String,– "SecurityGroupIds" : [ String, ... ],– "SecurityGroups" : [ String, ... ],

AWS CloudFormation

Page 34: Programando sua infraestrutura com o AWS CloudFormation

Recursos – Amazon EC2:

"SourceDestCheck" : Boolean,

"SubnetId" : String,

"Tags" : [ EC2 Tag, ... ],

"Tenancy" : String,

"UserData" : String,

"Volumes" : [ EC2 MountPoint, ... ]

}

}

AWS CloudFormation

Page 35: Programando sua infraestrutura com o AWS CloudFormation

METADATA

AWS CloudFormation

Page 36: Programando sua infraestrutura com o AWS CloudFormation

Use AWS::CloudFormation::Init com cfn-init para ajudar a fazer o “bootstrap” das instâncias:"Metadata": {

"AWS::CloudFormation::Init" : {

"config" : {

"packages" : {

},

"sources" : {

},

"commands" : {

},

"files" : {

},

"services" : {

},

"users" : {

},

"groups" : {

}

}

}

AWS CloudFormation

Page 37: Programando sua infraestrutura com o AWS CloudFormation

Instale pacotes com a ferramenta nativa de gerenciamento de pacotes:“ServerHost" : {

"Type" : "AWS::EC2::Instance",

"Metadata" : {

"AWS:CloudFormation::Init" : {

"config" : {

"packages" : {

"yum" : {

"gcc" : [],

"gcc-c++" : [],

"make" : [],

"automake" : [],

AWS CloudFormation

Page 38: Programando sua infraestrutura com o AWS CloudFormation

Configure arquivos:

"/home/ec2-user/.s3cfg": {

"content": { "Fn::Join": [ "", [

"[default]","\n",

"access_key = ", { "Ref": "CFNKeys"}, "\n",

"secret_key = ", { "Fn::GetAtt": [ "CFNKeys", "SecretAccessKey" ]}, "\n" ] ] },

"group": "ec2-user",

"mode": "000600",

"owner": "ec2-user"

},

AWS CloudFormation

Page 39: Programando sua infraestrutura com o AWS CloudFormation

Publique código de tar, tar+gzip, tar+bz2 and zip.

Até Github!:"AWS::CloudFormation::Init" : {

"config" : {

"sources" : {

"/var/www/html" : "https://s3.amazonaws.com/cloudformation-examples/CloudFormationPHPSample.zip"

}

}

}

AWS CloudFormation

Page 40: Programando sua infraestrutura com o AWS CloudFormation

Ligue serviços dentro do host:"services" : {

"sysvinit" : {

"nginx" : {

"enabled" : "true",

"ensureRunning" : "true",

"files" : ["/etc/nginx/nginx.conf"],

"sources" : ["/var/www/html"]

},

"sendmail" : {

"enabled" : "false",

"ensureRunning" : "false"

}

}

}

AWS CloudFormation

Page 41: Programando sua infraestrutura com o AWS CloudFormation

Recursos – Amazon RDS:"MyDB" : {

"Type" : "AWS::RDS::DBInstance",

"Properties" : {

"DBName" : { "Ref" : "DBName" },

"AllocatedStorage" : { "Ref" : "DBAllocatedStorage" },

"DBInstanceClass" : { "Ref" : "DBClass" },

"Engine" : "MySQL",

"EngineVersion" : "5.5",

"MasterUsername" : { "Ref" : "DBUsername" } ,

"MasterUserPassword" : { "Ref" : "DBPassword" },

"DBSubnetGroupName" : { "Ref" : "MyDBSubnetGroup" },

"DBSecurityGroups" : [ { "Ref" : "MyDBSecurityGroup" } ]

}

}

AWS CloudFormation

Page 42: Programando sua infraestrutura com o AWS CloudFormation

Recursos – Amazon RDS:"Parameters" : {

"DBName": {

"Default": "MyDatabase",

"Description" : "The database name",

"Type": "String",

"MinLength": "1",

"MaxLength": "64",

"AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*",

"ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters."

},

"DBUsername": {

"Default": "admin",

"NoEcho": "true",

"Description" : "The database admin account username",

"Type": "String",

"MinLength": "1",

"MaxLength": "16",

"AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*",

"ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters."

},

AWS CloudFormation

Page 43: Programando sua infraestrutura com o AWS CloudFormation

Recursos – security groups:"ControllerSecurityGroup": {

"Type": "AWS::EC2::SecurityGroup",

"Properties": {

"GroupDescription": "Enable SSH access",

"SecurityGroupIngress": [

{

"IpProtocol": "tcp",

"FromPort": "22",

"ToPort": "22",

"CidrIp": "0.0.0.0/0"

}

]

}

}

In VPC? Add in: "VpcId" : { "Ref" : ”<your VPC>" },

AWS CloudFormation

Page 44: Programando sua infraestrutura com o AWS CloudFormation

Recursos – Amazon Virtual Private Cloud (VPC):”MyVPC" : {

"Type" : "AWS::EC2::VPC",

"Properties" : {

"CidrBlock" : "192.168.0.0/16”

}

}

AWS CloudFormation

Page 45: Programando sua infraestrutura com o AWS CloudFormation

Recursos – Amazon VPC (continued):"PublicSubnet" : {

"Type" : "AWS::EC2::Subnet",

"Properties" : {

"VpcId" : { "Ref" : ”MyVPC" },

"CidrBlock" : "192.168.1.0/24"

}

},

AWS CloudFormation

Page 46: Programando sua infraestrutura com o AWS CloudFormation

Recursos – Amazon VPC (continued): "InternetGateway" : {

"Type" : "AWS::EC2::InternetGateway",

"Properties" : {

}

},

"AttachGateway" : {

"Type" : "AWS::EC2::VPCGatewayAttachment",

"Properties" : {

"VpcId" : { "Ref" : ”MyVPC" },

"InternetGatewayId" : { "Ref" : "InternetGateway" }

}

},

AWS CloudFormation

Page 47: Programando sua infraestrutura com o AWS CloudFormation

Recursos – Amazon VPC(continued):"PublicRouteTable" : {

"Type" : "AWS::EC2::RouteTable",

"Properties" : {

"VpcId" : {"Ref" :  »MyVPC"},

}

},

"PublicRoute" : {

"Type" : "AWS::EC2::Route",

"Properties" : {

"RouteTableId" : { "Ref" : "PublicRouteTable" },

"DestinationCidrBlock" : "0.0.0.0/0",

"GatewayId" : { "Ref" : "InternetGateway" }

}

},

"PublicSubnetRouteTableAssociation" : {

"Type" : "AWS::EC2::SubnetRouteTableAssociation",

"Properties" : {

"SubnetId" : { "Ref" : "PublicSubnet" },

"RouteTableId" : { "Ref" : "PublicRouteTable" }

}

AWS CloudFormation

Page 48: Programando sua infraestrutura com o AWS CloudFormation

Recursos – Amazon Simple Storage Service (S3):"S3Bucket" : {

"Type" : "AWS::S3::Bucket",

"Properties" : {

"AccessControl" : "PublicRead",

"WebsiteConfiguration" : {

"IndexDocument" : "index.html",

"ErrorDocument" : "error.html"

}

},

"DeletionPolicy" : "Retain"

}

}

AWS CloudFormation

Page 49: Programando sua infraestrutura com o AWS CloudFormation

Versionamento!

Você tem um repositório de código, certo?

Se não, por favor crie um logo após o Webinar

AWS CloudFormation

Page 50: Programando sua infraestrutura com o AWS CloudFormation

Versionamento! • Você rastreia as atualizações no seu código• Mesma coisa com a infraestrutura:

– O que está sendo mudado?– Quem fez a atualização?– Quando foi feita?– Porquê?(atrelada a um ticket/bug/sistema de projetos?)

AWS CloudFormation

Page 51: Programando sua infraestrutura com o AWS CloudFormation

Testando:– Validação via API/linha de comando

$ aws --region=us-east-1 cloudformation validate-template --template-body file://$PWD/Lab1-nat_stack.template

{

"ResponseMetadata": {

"RequestId": "174228cc-2c59-11e3-a4b8-8d0a0ca6c09c"

},

"Description": "Builds a NAT host. **WARNING** This template creates Amazon EC2 instance(s). You will be billed for the AWS resources used if you create a stack from this template.",

"Parameters": [

{

"NoEcho": false,

"Description": "SubnetId of an existing Public facing subnet in your Virtual Private Cloud (VPC)",

"ParameterKey": "SubnetId"

},

……..

],

"Capabilities": []

AWS CloudFormation

Page 52: Programando sua infraestrutura com o AWS CloudFormation

Publicação e atualização via console ou API/linha de comando:

– Alguns cliques

OU– aws cloudformation create-stack --stack-name myteststack

--template-body file:////home//local//test//sampletemplate.json --parameters ParameterKey=string,ParameterValue=string

AWS CloudFormation

Page 53: Programando sua infraestrutura com o AWS CloudFormation

Demo!

Page 54: Programando sua infraestrutura com o AWS CloudFormation

Como aprender mais:– RTFM!

• http://aws.amazon.com/cloudformation/• http://aws.amazon.com/documentation/

cloudformation/• https://aws.amazon.com/cloudformation/aws-

cloudformation-templates/

AWS CloudFormation

Page 55: Programando sua infraestrutura com o AWS CloudFormation

[email protected]

Michel Pereira

Solutions Architect