Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest()...

80
Инфраструктура как TypeScript

Transcript of Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest()...

Page 1: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Инфраструктуракак TypeScript

Page 2: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

План

Page 3: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

План

Page 4: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

План

Page 5: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

АвтоматизацияCloud

3

Page 6: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

API управления ресурсами

Page 7: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Сервисы HTTP/REST

Content-Type: application/x-www-form-urlencoded; charset=UTF-8X-Amz-Date: 20130813T150211ZHost: ec2.amazonaws.comAuthorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20130813/us-east-1/ec2/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ced6826de92d2bdeed8f846f0bf508e8559e98e4b0194b84example54174deb456c

http://ec2.amazonaws.com/?Action=RunInstancesImageId=ami-2bb65342&MaxCount=3&MinCount=1&Monitoring.Enabled=true&Placement.AvailabilityZone=us-east-1a&Version=2016-11-15

Page 8: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

var launchRequest = new RunInstancesRequest(){

ImageId = amiID,InstanceType = "t1.micro",MinCount = 1,MaxCount = 1,KeyName = keyPairName,SecurityGroupIds = groups

};var launchResponse = ec2Client.RunInstances(launchRequest);var instances = launchResponse.Reservation.Instances;

SDK для вызова REST сервисов

Page 9: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

az storage account create \--location westus \--name samplesa \--resource-group myrg \--sku LRS

Командная строка

Page 10: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Сложности со скриптами

Page 11: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Desired State Configuration

6

Page 12: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Описание целевого состояния

Page 13: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Управление графами ресурсов

Page 14: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Характеристики

Page 15: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Инструменты от вендоров

Page 16: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Языки разметки

9

Yet

Another

Markup

Language

Page 17: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Azure ARM Templates: JSON

"resources": [{"apiVersion": "2016-01-01","type": "Microsoft.Storage/storageAccounts","name": "mystorageaccount","location": "westus","sku": {"name": "Standard_LRS"

},"kind": "Storage","properties": {}

}]

Page 18: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

AWS CloudFormation: YAML

Resources:S3BucketForURLs:Type: "AWS::S3::Bucket"DeletionPolicy: DeleteProperties:BucketName: !If [ "CreateNewBucket", !Ref "AWS::NoValue", !Ref S3BucketName ]WebsiteConfiguration:IndexDocument: "index.html"

LifecycleConfiguration:Rules:-Id: DisposeShortUrlsExpirationInDays: !Ref URLExpirationPrefix: "u"Status: Enabled

Page 19: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

resource "azurerm_storage_account" "sa" {name = "mysa"location = azurerm_resource_group.rg.locationresource_group_name = azurerm_resource_group.rg.nameaccount_tier = "Standard"account_replication_type = "LRS"

}

Terraform:HashiCorp Configuration Language

Page 20: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Языки разметки

Page 21: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Пример: Соотношение кода и разметки

KV Store

Table “URLs”

Function

“Add URL”

Function

“Open URL”

Page 22: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

{"Resources": {

"InstanceSecurityGroup": {"Type": "AWS::EC2::SecurityGroup","Properties": {

"SecurityGroupIngress": [ ... ]}

},"EC2Instance": {

"Type": "AWS::EC2::Instance","Properties": {

"InstanceType": "t2.micro","SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ],"ImageId": "ami-0080e4c5bc078760e"

}}

}}

Ссылки на ресурсы

Page 23: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

{"condition": "[equals(parameters('production'), 'Yes')]","type": "Microsoft.Compute/availabilitySets","apiVersion": "2017-03-30","name": "[variables('availabilitySetName')]","location": "[resourceGroup().location]","properties": {

"platformFaultDomainCount": 2,"platformUpdateDomainCount": 3

}}

Условия

Page 24: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

locals {files = ["index.php","main.php"]

}

resource "aws_s3_bucket_object" "files" {count = "${length(local.files)}"key = "${local.files[count.index]}"bucket = "${aws_s3_bucket.examplebucket.id}"source = "./src/${local.files[count.index]}"

}

Циклы

Page 25: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Повторное использование

Page 26: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Тестирование

Page 27: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Кажется, мы это

уже когда-то делали?

Page 28: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

IDEsCode completion

Unit testsTypes

FunctionsPackage managers

VersioningClasses

Code reviewsContracts

SDKsWorkflows

Refactoring

Page 29: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Pulumi

14

Page 30: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Универсальные языки программирования

Page 31: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Провайдеры

Page 32: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

const resourceGroup = new azure.core.ResourceGroup("rg");

const storageAccount = new azure.storage.Account("storage", {resourceGroupName: resourceGroup.name,accountReplicationType: "LRS",accountTier: "Standard",

});

Пример TypeScript

Page 33: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

const resourceGroup = new azure.core.ResourceGroup("rg");

const storageAccount = new azure.storage.Account("storage", {resourceGroupName: resourceGroup.name,accountReplicationType: "LRS",accountTier: "Standard",

});

DesiredState

Page 34: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Как работает

Pulumi

Page 35: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Static Websiteon AWS

17

Page 36: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

N провайдеров, M языков

Page 37: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

N провайдеров, M языков

Page 38: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Сложность O(N*M)

Page 39: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Сложность O(N+M)

Page 40: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Сложность O(N+M)

Page 41: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Управление состоянием

Page 42: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Serverless Functions

в Azure

22

Page 43: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Ресурсы, нужные для Azure Function

Page 44: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

// A resource group to contain our Azure Functionsconst resourceGroup = new azure.core.ResourceGroup("rg");

// A Node.js Azure Functionconst nodeApp = new azure.appservice.ArchiveFunctionApp("http", {

resourceGroup,archive: new pulumi.asset.FileArchive("./javascript"),

});

export const nodeEndpoint = nodeApp.endpoint;

Node.js Azure Function

Page 45: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Запустим pulumi up …

Type Name Plan+ pulumi:pulumi:Stack functions-dev create+ ├─ azure:appservice:ArchiveFunctionApp http create+ │ ├─ azure:storage:Account http create+ │ ├─ azure:appservice:Plan http create+ │ ├─ azure:storage:Container http create+ │ ├─ azure:storage:ZipBlob http create+ │ └─ azure:appservice:FunctionApp http create+ └─ azure:core:ResourceGroup rg create

Page 46: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

// A .NET (C#) Azure Functionconst dotnetApp = new azure.appservice.ArchiveFunctionApp("dotnet", {

resourceGroup,archive: new pulumi.asset.FileArchive("./dotnet/publish/"),appSettings: {

runtime: "dotnet",},

});

.NET Azure Function

Page 47: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

const linuxResourceGroup = new azure.core.ResourceGroup("linuxrg");

const linuxPlan = new azure.appservice.Plan("linux-asp", {resourceGroupName: linuxResourceGroup.name,kind: "Linux",sku: { tier: "Dynamic", size: "Y1" },reserved: true,

});

const pythonApp = new azure.appservice.ArchiveFunctionApp(...);

Python Azure Function on Linux

Page 48: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

const linuxResourceGroup = new azure.core.ResourceGroup("linuxrg");const linuxPlan = new azure.appservice.Plan("linux-asp", {...});

const pythonApp = new azure.appservice.ArchiveFunctionApp("http", {resourceGroup: linuxResourceGroup,plan: linuxPlan,archive: new pulumi.asset.FileArchive("./python"),appSettings: {

runtime: "python",},

});

Python Azure Function on Linux

Page 49: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

const f = new azure.appservice.HttpEventSubscription("greeting", {resourceGroup,callback: async (context, req) => {

return {status: 200,body: `Hello ${req.params.name}!`,

};},

});

Callbacks => Serverless Functions

Page 50: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

const queue = new azure.storage.Queue("myqueue", {storageAccountName: storageAccount.name,

});

queue.onEvent("MyMessageHandler", {callback: async (context, msg) => {

doWork(msg);},

});

Callbacks => Serverless Functions

Page 51: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Containers

27

Page 52: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Crosswalk for AWS

Page 53: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Load-balanced container instances

Load Balancer

Container

Container

Page 54: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

const listener = new awsx.elasticloadbalancingv2.NetworkListener("lb",{port: 80 });

const service = new awsx.ecs.FargateService("nginx", {desiredCount: 2,taskDefinitionArgs: {

containers: {nginx: {

image: "jonashackt/spring-boot-vuejs",memory: 512,portMappings: [listener],

}}}});

Nginx + Fargate + Load Balancer

Page 55: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Запустим pulumi up …

Type Name Status+ pulumi:pulumi:Stack pulumi-typescript-aws-fargate-dev created+ ├─ awsx:x:ec2:SecurityGroup nginx created+ │ └─ aws:ec2:SecurityGroup nginx created+ ├─ awsx:x:ec2:Vpc default-vpc-accd9bc5 created+ │ ├─ awsx:x:ec2:Subnet default-vpc-accd9bc5-public-1 created+ │ └─ awsx:x:ec2:Subnet default-vpc-accd9bc5-public-0 created+ ├─ awsx:x:ecs:FargateService spring-boot-vuejs created+ │ └─ aws:ecs:Service spring-boot-vuejs created+ ├─ awsx:x:ecs:FargateTaskDefinition spring-boot-vuejs created+ │ ├─ aws:cloudwatch:LogGroup spring-boot-vuejs created+ │ ├─ aws:iam:Role spring-boot-vuejs-execution created+ │ ├─ aws:iam:Role spring-boot-vuejs-task created+ │ ├─ aws:iam:RolePolicyAttachment spring-boot-vuejs-execution-9a42f520 created+ │ ├─ aws:iam:RolePolicyAttachment spring-boot-vuejs-task-32be53a2 created+ │ ├─ aws:iam:RolePolicyAttachment spring-boot-vuejs-task-fd1a00e5 created+ │ └─ aws:ecs:TaskDefinition spring-boot-vuejs created+ ├─ awsx:x:ecs:Cluster default-cluster created+ │ ├─ awsx:x:ec2:SecurityGroup default-cluster created+ │ │ ├─ awsx:x:ec2:IngressSecurityGroupRule default-cluster-ssh created+ │ │ │ └─ aws:ec2:SecurityGroupRule default-cluster-ssh created+ │ │ ├─ awsx:x:ec2:IngressSecurityGroupRule default-cluster-containers created+ │ │ │ └─ aws:ec2:SecurityGroupRule default-cluster-containers created+ │ │ ├─ awsx:x:ec2:EgressSecurityGroupRule default-cluster-egress created+ │ │ │ └─ aws:ec2:SecurityGroupRule default-cluster-egress created+ │ │ └─ aws:ec2:SecurityGroup default-cluster created+ │ └─ aws:ecs:Cluster default-cluster created+ └─ aws:lb:ApplicationLoadBalancer nginx created+ ├─ awsx:lb:ApplicationTargetGroup nginx created+ │ └─ aws:lb:TargetGroup nginx created+ ├─ awsx:lb:ApplicationListener nginx created+ │ ├─ awsx:x:ec2:IngressSecurityGroupRule nginx-external-0-ingress created+ │ │ └─ aws:ec2:SecurityGroupRule nginx-external-0-ingress created+ │ ├─ awsx:x:ec2:EgressSecurityGroupRule nginx-external-0-egress created+ │ │ └─ aws:ec2:SecurityGroupRule nginx-external-0-egress created+ │ └─ aws:lb:Listener nginx created+ └─ aws:lb:LoadBalancer nginx created

Page 56: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Cosmos App

30

Page 57: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Cosmos App (1)

Page 58: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Cosmos App (2)

Page 59: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Cosmos App (3)

Page 60: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

export const functions = new CosmosApp("urls", {resourceGroup,locations: ["WestEurope", "WestUS", "SouthEastAsia"],factory: ({location, cosmosdb}) => {

const app = new azure.appservice.ArchiveFunctionApp("app", {location,archive: new pulumi.asset.FileArchive("./app"),appSettings: {

COSMOSDB_ENDPOINT: cosmosdb.endpoint,},

});

return { id: app.functionApp.id };}});

Глобальные приложения

Page 61: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

export const functions = new CosmosApp("urls", {resourceGroup,locations: ["WestEurope", "WestUS", "SouthEastAsia"],factory: ({location, cosmosdb}) => {

const app = new azure.appservice.ArchiveFunctionApp("app", {location,archive: new pulumi.asset.FileArchive("./app"),appSettings: {

COSMOSDB_ENDPOINT: cosmosdb.endpoint,},

});

return { id: app.functionApp.id };}});

Глобальные приложения

Page 62: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Kubernetes

33

Page 63: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

class AksCluster extends pulumi.ComponentResource {constructor(name: string,

args: AksClusterArgs,opts: pulumi.ComponentResourceOptions = {}) {

super("examples:aks:AksCluster", name, args, opts);

const password = new random.RandomPassword("password"/*, {...}*/);const sshPublicKey = new tls.PrivateKey("key"/*, {...}*/);const adApp = new azuread.Application("aks"/*, {...}*/);const adSp = new azuread.ServicePrincipal("aksSp"/*, {...}*/);const vnet = new azure.network.VirtualNetwork("vnet"/*, {...}*/);const subnet = new azure.network.Subnet("subnet"/*, {...}*/);const cluster = new azure.containerservice.KubernetesCluster("aksCluster"/*, {...}*/)

}}

Managed Clusters

Page 64: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Crosswalkfor

Kubernetes

Page 65: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

// Define the application Pod.const appPod = new kx.PodBuilder({

containers: [{image: "app:1.0.0",env: { "APP_CONFIG_PATH": "/app/config" },volumeMounts: [configs.mount("/app/config")],

}],});

// Create a Kubernetes Deployment using the previous Pod definition.const deployment = new kx.Deployment("nginx", {

spec: appPod.asDeploymentSpec({ replicas: 3 }),});

// Expose the Deployment with a load balancer using a Kubernetes Service.const service = deployment.createService({

type: kx.types.ServiceType.LoadBalancer,});

Библиотека Kx

Page 66: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

// Find all distinct versions of MySQL running in your cluster.const mySqlVersions = kq

.list("v1", "Pod")

.flatMap(pod => pod.spec.containers)

.map(container => container.image)

.filter(imageName => imageName.includes("mysql"))

.distinct();

mySqlVersions.forEach(console.log);

Запросы

Page 67: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Контроль качества

36

Page 68: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Языки программирования

для инфраструктуры?

Точно?

Page 69: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

const group = require("./index").group;

// check: Instances must not have SSH open to the Internet.it("must not open port 22 (SSH) to the Internet", done => {

pulumi.all([ group.urn, group.ingress ]).apply(([ urn, ingress ]) => {if (ingress.find(rule =>

rule.fromPort == 22 && rule.cidrBlocks.find(block => block === "0.0.0.0/0"))) {

done(new Error(`Illegal SSH port 22 open to the Internet on group ${urn}`));} else {

done();}

});});

Unit Testing

Page 70: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

const policies = new PolicyPack("aws", {policies: [{name: "prohibited-public-internet",description: "Ingress rules with public internet access are prohibited.",enforcementLevel: "mandatory",validateResource: validateTypedResource(aws.ec2.SecurityGroup, (sg, args, report) => {const publicInternetRules = (sg.ingress || []).find(ingressRule =>(ingressRule.cidrBlocks || []).find(cidr => cidr === "0.0.0.0/0"));

if (publicInternetRules) {report("Ingress rules with public internet access are prohibited.");

}}),

},],

});

Policy as Code

Page 71: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

AWS Cloud Development Kit (CDK)?

39

Page 72: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

м

TypeScript

Python

Java

.NET

Транслируется в CloudFormation

Page 73: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

const hello = new lambda.Function(this, 'HelloHandler', {runtime: lambda.Runtime.NODEJS_8_10, code: lambda.Code.asset('lambda'), handler: 'hello.handler'

});

new apigw.LambdaRestApi(this, 'Endpoint', {handler: hello

});

Пример AWS CDK

Page 74: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Примеры из моей презентации

✓ ✓

✓ ✓

Page 75: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Выводы

40

Page 76: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Используйте

Инфраструктуру как

кодСоздаёте

приложения для cloud?

Page 77: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Меньшие компоненты

Лучшая автоматизация

Page 78: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

Преимущества кода

Page 79: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =

мИнфраструктура как код

Архитектура как код

Page 80: Инфраструктура как TypeScript · var launchRequest = new RunInstancesRequest() {ImageId = amiID, InstanceType = "t1.micro", MinCount = 1, MaxCount = 1, KeyName =