aws(学习笔记第十八课)
- 使用
aws cdk(python)进行部署
学习内容:
- 使用
aws cdk(python)进行部署 - 整体代码(
python的通常工程) - 代码动作
1. 使用aws cdk(python)进行部署
aws cdk的整体架构
前面使用了cloudformation进行了json的aws的各种组件的定义和使用,但是对于熟悉开发语言程序员,不能进行灵活的使用开发语言(python,nodejs,java等等)进行灵活的aws组件的定义部署,实在是不能接受的,aws cdk满足了这方面的要求。
使用aws cdk,可以使用各种熟悉的语言就行aws的部署,另外还避免了aws cloudformation的复杂json的代码编写。但是,底层来说,aws cdk还是会将写出的aws配置,最终转换成cloudformation,进行部署。
2. 整体代码(python的通常工程)
以python为基础语言,开始开发aws cdk。
-
环境准备
需要以下的软件准备。
AWS CLI#最终执行的aws cdk的底层命令AWS Account and User#最终执行的aws cdk的用户Node.js#使用Node.js安装cdkIDE for your programming language# 一般使用vs codeAWS CDK Toolkit#cdk的命令安装Python#cdk的开发语言
-
各种软件安装详细
aws cli
aws cli可以使用installer来安装。
-
AWS Account and User这里需要创建用户,用来执行
cdk。

-
Node.js
nodejs

-
IDE for your programming language# 一般使用vs code这个比较通用,省略安装步骤。
-
AWS CDK Toolkit#cdk的安装shellnpm install -g aws-cdk
-
Python#cdk的开发语言安装开发语言
Python
python downloads
-
开始简单的
aws cdk程序开发-
程序文件夹作成(使用
git bash中执行)
注意,没有特殊说明,执行的命令都是在项目的文件夹下shellmkdir finlay_20241215 && cd finlay_20241215 -
激活
virtual environment venvshellpython -m venv .venv source .venv/Scripts/activate -
作成
cdk的工程shellcdk init app --language python -
将
pip的download url指向aliyun阿里云shellpip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ pip config set install.trusted-host mirrors.aliyun.com -
编写
cdk的python代码(finlay_20241215/app.py)python#!/usr/bin/env python3 import os import aws_cdk as cdk from aws_cdk import ( aws_ec2 as ec2,Stack ) from constructs import Construct from finlay_20241215.finlay_20241215_stack import Finlay20241215Stack app = cdk.App() class Finlay20241215Stack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # VPC my_vpc = ec2.Vpc( self, id="my-vpc", cidr="192.168.0.0/16", nat_gateways=0, # NatGatewayを作成しない指定 subnet_configuration=[ ec2.SubnetConfiguration( name="my-public-subnet", subnet_type=ec2.SubnetType.PUBLIC, cidr_mask=24 ) ] ) # security group my_ec2_security_group = ec2.SecurityGroup( self, id="my-ec2-sg", vpc=my_vpc, allow_all_outbound=True, security_group_name="my-ec2-sg" ) # add ingress rule my_ec2_security_group.add_ingress_rule( peer=ec2.Peer.ipv4("0.0.0.0/0"), connection=ec2.Port.tcp(22), description="allow ssh access" ) # set ami amzn_linux = ec2.MachineImage.latest_amazon_linux( generation=ec2.AmazonLinuxGeneration.AMAZON_LINUX, edition=ec2.AmazonLinuxEdition.STANDARD, virtualization=ec2.AmazonLinuxVirt.HVM, storage=ec2.AmazonLinuxStorage.GENERAL_PURPOSE, cpu_type=ec2.AmazonLinuxCpuType.X86_64 ) # launch ec2 instance my_ec2_instance = ec2.Instance( self, id="my-ec2-instance", instance_type=ec2.InstanceType.of( ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.MICRO ), machine_image=amzn_linux, vpc=my_vpc, vpc_subnets=ec2.SubnetSelection( subnet_type=ec2.SubnetType.PUBLIC ), instance_name="my-ec2-instance", security_group=my_ec2_security_group ) Finlay20241215Stack(app, "Finlay20241215Stack") app.synth() -
pip导入必须要的cdk依赖包shellpip install -r requirements.txt -
执行
cdk diff查看将要进行的cdk执行的差分shellcdk diff

-
3. 代码动作
-
执行
cdk bootstrap
默认aws下,是没有执行cdk所需要的role的,第一次需要执行cdk bootstrapshellcdk bootstrap
之后检查aws的role作成情况。

-
为
aws cli的用户附上权限
这里,虽然已经自动生成了role来表示能够执行cdk,但是aws cli的执行用户还是没有能够sts:AssumeRole即assume这些role的权限。需要继续准备。-
选择
aws cli用户,添加权限

这里,选择创建内联权限

选择JSON直接进行编辑

权限JSON代码json{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": [ "arn:aws:iam::*:role/cdk-*" ] } ] }
-

至此,aws cli的当前用户就能够执行cdk-开头的role,有权限执行aws cdk。
-
执行
deployshellcdk --require-approval never deploy默认需要承认(
approval),会导致不执行部署,这里设置成--require-approval never

可以看到,这里还是通过cloudformation底层来实现aws服务的部署。

进入cloudformation之后,看到会出现stack

检查ec2 instance

最后清理cloudformation