공부하기싫어
article thumbnail

개발 환경 구축 순서

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 는 신이다

 

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 에게 부탁해보자

 

vpc

 # 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 까지 확인해봤다

 

cdk deploy

stack arn 으로 가서 확인해봤다

 

cdkappstack

음... 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

 

GitHub - aws-samples/aws-cdk-examples: Example projects using the AWS CDK

Example projects using the AWS CDK. Contribute to aws-samples/aws-cdk-examples development by creating an account on GitHub.

github.com

 

 

계획 수정

흠.. 일단 앞으로의 계획을 조금 수정해야겠다.

 

우선 cdk 로 생성할 cloudformation 리소스들은 모두 서버리스 리소스들만 관리하고

ec2 인스턴스 1개는 직접 빌드하고 관리하는 걸로 해야겠다.

 

ci/cd 파이프라인은 그대로 적용하되 iac 에서 인스턴스는 제외하는 것이다.

 

그리고 추가로 aws 서비스를 하나 더 추가할 것 같다.

SSM parameter Store 로 upbit api key 를 저장해서 사용할 수 있을것 같아서 추가를 고려해보고 있다.

지금까진 코드에 엑세스키를 추가해서 사용했었는데 파라미터 스토어를 사용해서 1차적으로 보호해주는 방법을 생각해봤다.

 

기본 설계에 추가해봐야겠다.