개발 환경 구축 순서
1. CDK container setting
- install aws-cli
- install cdk-cli
2. create demo stack
- create python code with chatGPT
- test
3. ci/cd pipeline setting
- jenkins config
- ansible config
- github config
4. test
- test
23.03.06
2. Create Demo Stack
jenkins 와 연동하기 전에 cdk 컨테이너에서 app-stack 을 정의한 python 파일을 실행 시켜 cloudformation 에 스택이 생성되는지 확인하려고 한다
ec2 instance 1개
lambda function 2개
dynamoDB Table 1개
cloudwatch alarm 2개
만 우선 생성해보는걸로 하자
iam role 은 나중에 추가해주는 걸로 하자 아마 dynamoDB CURD 에 대한 권한을 람다와 ec2 에 줘야할꺼다
먼저 cdk python 코드를 짜야하는데 chatGPT 에게 물어봤다
chatGPT
진짜 chatGPT 는 신이다
chatGPT 활용 결과 보기
3.5 노트
cdk-app-stack-from-chatGPT.py
from aws_cdk import (
aws_ec2 as ec2,
aws_lambda as _lambda,
aws_dynamodb as dynamodb,
aws_cloudwatch as cloudwatch,
aws_cloudwatch_actions as cw_actions,
core,
)
class MyStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs):
super().__init__(scope, id, **kwargs)
# Create a VPC for the instance
vpc = ec2.Vpc(
self, "MyVpc",
max_azs=2,
cidr="10.0.0.0/16",
subnet_configuration=[
ec2.SubnetConfiguration(
name="public", cidr_mask=24, subnet_type=ec2.SubnetType.PUBLIC
)
]
)
# Create an EC2 instance
instance = ec2.Instance(
self, "MyInstance",
instance_type=ec2.InstanceType("t2.micro"),
machine_image=ec2.AmazonLinuxImage(),
vpc=vpc,
key_name="my-ec2-keypair"
)
# Create two Lambda functions
function1 = _lambda.Function(
self, "MyLambdaFunction1",
runtime=_lambda.Runtime.PYTHON_3_8,
handler="lambda_function1.handler",
code=_lambda.Code.from_asset("path/to/lambda/function1"),
timeout=core.Duration.seconds(30)
)
function2 = _lambda.Function(
self, "MyLambdaFunction2",
runtime=_lambda.Runtime.PYTHON_3_8,
handler="lambda_function2.handler",
code=_lambda.Code.from_asset("path/to/lambda/function2"),
timeout=core.Duration.seconds(30)
)
# Create a DynamoDB table
table = dynamodb.Table(
self, "MyDynamoDBTable",
partition_key=dynamodb.Attribute(
name="ID",
type=dynamodb.AttributeType.STRING
),
removal_policy=core.RemovalPolicy.DESTROY
)
# Create two CloudWatch alarms
alarm1 = cloudwatch.Alarm(
self, "MyCloudWatchAlarm1",
alarm_description="My first CloudWatch alarm",
metric=instance.metric_cpu_utilization(),
threshold=80,
evaluation_periods=2,
comparison_operator=cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
alarm_name="my-cpu-alarm"
)
alarm2 = cloudwatch.Alarm(
self, "MyCloudWatchAlarm2",
alarm_description="My second CloudWatch alarm",
metric=function1.metric_errors(),
threshold=5,
evaluation_periods=3,
comparison_operator=cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
alarm_name="my-error-alarm"
)
# Add an action to the first alarm
alarm1.add_alarm_action(
cw_actions.SnsAction(
topic=my_sns_topic,
message_body="CPU utilization is above 80%"
)
)
app = core.App()
MyStack(app, "MyStack")
app.synth()
뒤에 조언까지 붙여줬는데 값들을 수정해서 사용하라고 한다
개미쳣네 ㄹㅇ
하나씩 수정해보자
일단 vpc 는 기본 vpc 에 배포할꺼다
한번 더 chatGPT 에게 부탁해보자
# Use the 2a subnet in the default VPC
subnet_selection = ec2.SubnetSelection(subnet_id='[subnet id]')
# Get the default VPC
default_vpc = ec2.Vpc.from_lookup(self, 'DefaultVPC', is_default=True)
# Create an EC2 instance
instance = ec2.Instance(
self, "MyInstance",
instance_type=ec2.InstanceType("t2.micro"),
machine_image=ec2.AmazonLinuxImage(),
vpc=default_vpc,
vpc_subnets=subnet_selection,
key_name="my-ec2-keypair"
)
걍 개미쳣다 ㅋㅋ
위처럼 바꿔주는데 그러면 좀더 디테일하게 부탁해보자
뭐 못하는게 없네 진짜
코더들 실직 위기!
조금 더 코드를 다듬어서 나중에 코드만 넣으면 돌아가게끔 만들어봐야겠다
chatGPT 가 짜준 코드 동작을 확인을 위해 scp 로 jenkins-server 안으로 파일을 옮기고
docker cp 로 컨테이너 안으로 파일을 옮긴 다음 lib 디렉토리를 만들고
cdk bootstrap 을 한번 실행해봤다
잘된다
cloudformation 에 가서 확인해보면
cloudformation 배포를 위한 각종 iam role 들이 생성된 toolkit 스택이 배포된것을 확인할 수 있다
이후 deploy 까지 확인해봤다
stack arn 으로 가서 확인해봤다
음... metadata 만 생성되고 다른 리소스는 생성되지 않았다
bootstrap 과정에서 문제가 있었나보다
cdk synth
이 명령으로 템플릿 파일을 확인해보니 따로 나온게 없었다
왜 템플릿 파일이 잘 생성이 안됐는지 다시 확인해보자
23.3.7
여러가지 에러가 발생했다.
Error 1. nodejs 최신화 문제
npm 을 설치하면 node 가 12로 설치되는데 cdk 가 12 를 지원하지 않았다.
dockerfile 을 수정해서 nodejs 를 업데이트 하는 작업을 추가해줬다
# update nodejs
RUN npm cache clean -f
RUN npm install -g n
RUN n latest
Error 2. venv 가상환경 문제?
cdk 를 설치하면 나오는 명령어를 직접 실행했었는데
cdk 에서 주는 source.bat 을 실행하는걸로 바꿨다
# running virtual environment
cat source.bat
source .venv/bin/activate
Error 3. 모듈 문제
chatGPT 에게 물어봐서 받은 코드는 cdk v1 인것 같다.
cdk v2 의 python 과는 호환이 안되는 구문을 사용하는 것 같다.
그래서 모듈 import 부분을 aws-cdk github 에서 찾아서 그대로 바꿔줬다.
Error 4. aws-cdk version 호환 문제
역시나 chatGPT 가 짜준 python 코드는 cdk version1 과 호환되서 그런지 ec2 를 정의하는데 한줄한줄 모두 에러가 발생했다.
- 모듈 함수에 들어가는 인자의 자료형이 잘못된 경우
- 모듈 함수에 인자가 아예 잘못된 경우
실제 AWS Github 의 EXAMPLES 들을 보니
chatGPT 가 짜준 코드와는 상당히 상이한 모습임
https://github.com/aws-samples/aws-cdk-examples
계획 수정
흠.. 일단 앞으로의 계획을 조금 수정해야겠다.
우선 cdk 로 생성할 cloudformation 리소스들은 모두 서버리스 리소스들만 관리하고
ec2 인스턴스 1개는 직접 빌드하고 관리하는 걸로 해야겠다.
ci/cd 파이프라인은 그대로 적용하되 iac 에서 인스턴스는 제외하는 것이다.
그리고 추가로 aws 서비스를 하나 더 추가할 것 같다.
SSM parameter Store 로 upbit api key 를 저장해서 사용할 수 있을것 같아서 추가를 고려해보고 있다.
지금까진 코드에 엑세스키를 추가해서 사용했었는데 파라미터 스토어를 사용해서 1차적으로 보호해주는 방법을 생각해봤다.
기본 설계에 추가해봐야겠다.
'1인개발 메이킹로그 > [Infra+k8s+App] 가상화폐 자동매매' 카테고리의 다른 글
[AWS-Server] 개발 일정 변경 (0) | 2023.03.27 |
---|---|
[AWS-Server] dev_env-CICD-3-jenkins (0) | 2023.03.23 |
[AWS-Server] dev_env-CICD-1-CDK container setting (0) | 2023.03.02 |
[AWS-Server]Ethereum-auto-trade 개발 환경 CI/CD 설계 (0) | 2023.03.02 |
[AWS-Server] Ethereum-auto-trade 설계 (0) | 2023.02.18 |