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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm -g install typescript
npm install -g aws-cdk
cdk --version
npm -g install typescript npm install -g aws-cdk cdk --version
npm -g install typescript
npm install -g aws-cdk
cdk --version

Tworzenie aplikacji

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mkdir bastion-cdk
cd bastion-cdk
cdk init app --language typescript
mkdir bastion-cdk cd bastion-cdk cdk init app --language typescript
mkdir bastion-cdk
cd bastion-cdk
cdk init app --language typescript

Budowanie aplikacji

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm run build
cdk ls
npm run build cdk ls
npm run build
cdk ls

Konfiguracja VPC

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install @aws-cdk/aws-ec2
npm install @aws-cdk/aws-ec2
npm install @aws-cdk/aws-ec2
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import * as ec2 from '@aws-cdk/aws-ec2';
import * as ec2 from '@aws-cdk/aws-ec2';
import * as ec2 from '@aws-cdk/aws-ec2';
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
get availabilityZones(): string[] {
return ['us-east-1a', 'us-east-1b'];
}
get availabilityZones(): string[] { return ['us-east-1a', 'us-east-1b']; }
get availabilityZones(): string[] {
    return ['us-east-1a', 'us-east-1b'];
  }
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 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 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,
        }
      ]
    });
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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');
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');
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');
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
subnetType: ec2.SubnetType.ISOLATED,
name: 'Isolated-subnet',
cidrMask: 24,
}
{ subnetType: ec2.SubnetType.ISOLATED, name: 'Isolated-subnet', cidrMask: 24, }
{
          subnetType: ec2.SubnetType.ISOLATED,
          name: 'Isolated-subnet',
          cidrMask: 24,
        }
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm run build
cdk ls
cdk synth
cdk deploy
npm run build cdk ls cdk synth cdk deploy
npm run build
cdk ls
cdk synth
cdk deploy
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
get availabilityZones(): string[] {
return ['eu-central-1a', 'eu-central-1b'];
}
get availabilityZones(): string[] { return ['eu-central-1a', 'eu-central-1b']; }
get availabilityZones(): string[] {
    return ['eu-central-1a', 'eu-central-1b'];
  }
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cdk deploy
cdk deploy
cdk deploy
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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',
})
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', })
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',
    })
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cdk diff
cdk diff
cdk diff
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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',
})
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', })
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',
    })
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cdk deploy
cdk deploy
cdk deploy
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
new cdk.CfnOutput(this, 'InstancjaPublicznaIp', {
value: instance.instancePublicIp
})
new cdk.CfnOutput(this, 'InstancjaOdizolowanaIp', {
value: instance2.instancePrivateIp
})
new cdk.CfnOutput(this, 'InstancjaPublicznaIp', { value: instance.instancePublicIp }) new cdk.CfnOutput(this, 'InstancjaOdizolowanaIp', { value: instance2.instancePrivateIp })
new cdk.CfnOutput(this, 'InstancjaPublicznaIp', {
      value: instance.instancePublicIp
    })
    new cdk.CfnOutput(this, 'InstancjaOdizolowanaIp', {
      value: instance2.instancePrivateIp
    })
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cdk diff
cdk synth
cdk deploy
cdk diff cdk synth cdk deploy
cdk diff
cdk synth
cdk deploy
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm run build
npm test
npm run build npm test
npm run build
npm test
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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' }));
});
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' })); });
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' }));
});
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm test
npm test
npm test

Czyszczenie

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cdk destroy
cdk destroy
cdk destroy
Szafrański Michał
Jako Architekt IT, nie tylko projektuję systemy informatyczne, ale również moje życie jest zaprojektowane w taki sposób, aby działać jak dobrze zaprojektowany system - jestem zawsze gotowy na wszelkie wyzwania i problemy. Podobnie jak każdy system, który projektuję, staram się być skalowalny i elastyczny, a czasem trudno przewidzieć, kiedy potrzebna będzie aktualizacja. Często słyszę pytanie: "Kiedy zostanie wydany update twojego życia?" A ja odpowiadam: "Kiedyś, ale zanim to nastąpi, muszę zebrać więcej danych i przeprowadzić odpowiednie testy." Moje życie to nie tylko kodowanie i projektowanie, ale również ciągłe doskonalenie i uczenie się nowych technologii. Nieustannie próbuję wprowadzać ulepszenia, zarówno w moim życiu osobistym, jak i zawodowym. A jeśli coś nie działa, nie boję się eksperymentować i próbować różnych rozwiązań, aby znaleźć najlepsze rozwiązanie. Nie jestem tylko architektem IT - jestem również architektem swojego życia, zaprojektowanym w taki sposób, aby działał jak dobrze zaprojektowany system.

Leave a Reply Text

undefined