fbpx

AWS CDK – Cloud Development Kit

Budowaniu infrastruktury jako kodu nigdy nie było prostsze, gdyż CDK wykorzystuje języki jakie doskonale znasz (TypeScript, JavaScript, Python, Java, C# lub Go) i możesz stosować ich mocne strony do budowy chmury. Na warsztatach ustawisz sobie środowisko do programowania Infrastructure as Code (IaC) i zakodujesz proste rozwiązanie. Zapewniam, że to łatwiejsze od Terraforma.

Warsztaty live w ramach AWSowego tygodnia ➡️ https://www.akademiaarchitektait.pl/plan-wydarzen-awsowego-tygodnia/


Polecenia i kod wykorzystany w warsztatach

Instalacja CDK

npm -g install typescript
npm install -g aws-cdk
cdk --version

Tworzenie aplikacji

mkdir bastion-cdk
cd bastion-cdk
cdk init app --language typescript

Budowanie aplikacji

npm run build
cdk ls

Konfiguracja VPC

npm install @aws-cdk/aws-ec2
import * as ec2 from '@aws-cdk/aws-ec2';
get availabilityZones(): string[] {
    return ['us-east-1a', 'us-east-1b'];
  }
const vpc = new ec2.Vpc(this, 'VPC_utworzona_w_CDK', {
      cidr: '172.16.0.0/16',
      maxAzs: 1,
      natGateways: 0,
      subnetConfiguration: [
        {
          subnetType: ec2.SubnetType.PUBLIC,
          name: 'Public-subnet',
          cidrMask: 24,
        },
        {
          subnetType: ec2.SubnetType.PRIVATE,
          name: 'Private-subnet',
          cidrMask: 24,
        }
      ]
    });
const cdkSecurityGroup = new ec2.SecurityGroup(this, 'cdkSecurityGroup', {
      vpc,
      description: 'Pozwalaj na SSH i Ping',
      allowAllOutbound: true
    });
    cdkSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22), 'Pozwalaj na ssh z dowolnego adresu ip');
    cdkSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.allIcmp(), 'Pozwalaj na ping z dowolnego adresu ip');
{
          subnetType: ec2.SubnetType.ISOLATED,
          name: 'Isolated-subnet',
          cidrMask: 24,
        }
npm run build
cdk ls
cdk synth
cdk deploy
get availabilityZones(): string[] {
    return ['eu-central-1a', 'eu-central-1b'];
  }
cdk deploy
const instance = new ec2.Instance(this, 'Instancja-publiczna', {
      vpc: vpc,
      vpcSubnets: vpc.selectSubnets({subnetType: ec2.SubnetType.PUBLIC}),
      securityGroup: cdkSecurityGroup,
      instanceName: 'Instancja-publiczna',
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.MICRO),
      machineImage: ec2.MachineImage.latestAmazonLinux({
        generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      }),
      keyName: 'kluczvpc',
    })
cdk diff
const instance2 = new ec2.Instance(this, 'Instancja-odizolowana', {
      vpc: vpc,
      vpcSubnets: vpc.selectSubnets({subnetType: ec2.SubnetType.ISOLATED}),
      securityGroup: cdkSecurityGroup,
      instanceName: 'Instancja-odizolowana',
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.MICRO),
      machineImage: ec2.MachineImage.latestAmazonLinux({
        generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      }),
      keyName: 'kluczvpc',
    })
cdk deploy
new cdk.CfnOutput(this, 'InstancjaPublicznaIp', {
      value: instance.instancePublicIp
    })
    new cdk.CfnOutput(this, 'InstancjaOdizolowanaIp', {
      value: instance2.instancePrivateIp
    })
cdk diff
cdk synth
cdk deploy
chmod 400 kluczvpc.pem
ssh -i "kluczvpc.pem" ec2-user@IpPubliczne

scp -i "kluczvpc.pem" kluczvpc.pem ec2-user@IpPubliczne:/home/ec2-user/

chmod 400 kluczvpc.pem
ssh -i "kluczvpc.pem" ec2-user@IpPrywatne

Testy jednostkowe

npm run build
npm test
test('Instancja typu t2.micro', () => {
  const app = new cdk.App();
  const stack = new BastionCdk.BastionCdkStack(app, 'MyTestStack');

  expectCDK(stack).to(haveResourceLike('AWS::EC2::Instance', { InstanceType: 't2.micro' }));
});

test('Klucz SSH musi nazywać się kluczvpc', () => {
  const app = new cdk.App();
  const stack = new BastionCdk.BastionCdkStack(app, 'MyTestStack');

  expectCDK(stack).to(haveResourceLike('AWS::EC2::Instance', { KeyName: 'kluczvpc' }));
});
npm test

Czyszczenie

cdk destroy
Szafrański Michał
Uczę programistów efektywnego wykorzystania chmury AWS do ich pracy twórczej.