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