팀 프로젝트- 1회차

박형준·2024년 6월 14일

chat gpt 작성 요령

  1. 구체적이고 명확한 질문 작성
  • 구체적이고 명확한 질문을 작성하면 더 정확한 답변을 받을 수 있습니다.

    • 나쁜 예시: "테라폼에 대해 설명해 주세요."

    • 좋은 예시: "테라폼을 사용하여 AWS에 VPC를 생성하는 방법을 단계별로 알려주세요."

  1. 배경 정보 제공
  • 질문에 필요한 배경 정보를 제공하면 더 유용한 답변을 받을 수 있습니다.

    • 나쁜 예시: "배포 문제가 있어요."

    • 좋은 예시: "앤서블을 사용하여 Nginx를 배포하려고 하는데, ansible-playbook 실행 시 'host unreachable' 오류가 발생합니다. 해결 방법을 알려주세요."

  1. 예제 코드 포함
  • 코드와 관련된 질문에는 현재 작성한 코드나 시도한 내용을 포함합니다.

    • 나쁜 예시: "설문 목록 조회 함수가 작동하지 않아요."

    • 좋은 예시: "아래는 제가 작성한 설문 목록 조회 함수입니다. listSurveys 함수에서 데이터베이스 연결 오류가 발생하는데, 어떤 부분을 수정해야 할까요?"

import sqlite3

def listSurveys():
    try:
        conn = sqlite3.connect('surveys.db')
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM surveys")
        surveys = cursor.fetchall()
        conn.close()
        return surveys
    except Exception as e:
        print(f"Error: {e}")
  1. 예상 결과와 실제 결과 설명
  • 문제가 발생한 경우, 기대한 결과와 실제 결과를 설명합니다.

    • 나쁜 예시: "내 코드가 작동하지 않아요."

    • 좋은 예시: "아래 코드를 실행하면 설문 목록이 반환되기를 기대했는데, 대신 빈 목록이 반환됩니다. 문제가 무엇인지 알 수 있을까요?"

import sqlite3

def listSurveys():
    conn = sqlite3.connect('surveys.db')
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM surveys")
    surveys = cursor.fetchall()
    conn.close()
    return surveys

print(listSurveys())
  1. 질문의 목적 명확히 하기
  • 왜 이 질문을 하는지, 무엇을 달성하고자 하는지 명확히 합니다.

    • 나쁜 예시: "API 호출하는 방법이 뭐예요?"

    • 좋은 예시: "Python에서 REST API를 호출하여 JSON 응답을 파싱하는 방법을 알고 싶습니다. 예시 코드가 있을까요?"

  1. 단락 구분 및 포맷팅
  • 질문을 이해하기 쉽게 포맷팅하고 단락을 구분합니다.

    • 나쁜 예시: "테라폼과 앤서블을 사용하고 있어요. 테라폼을 통해 인프라를 설정한 후 앤서블로 배포를 자동화하고 싶은데 어떻게 해야 할지 모르겠어요. 설정 파일 예시가 있나요?"
    • 좋은 예시:
테라폼과 앤서블을 사용하여 인프라를 설정하고 배포를 자동화하고 싶습니다.

1. 테라폼을 사용하여 AWS에 VPC를 생성했습니다.
2. 이 VPC 내에 EC2 인스턴스를 생성했습니다.
3. 앤서블을 사용하여 이 EC2 인스턴스에 Nginx를 배포하고 싶습니다.

테라폼과 앤서블 설정 파일의 예시를 제공해 주실 수 있나요?

종합 예시

  • 질문을 작성할 때 위의 팁들을 종합적으로 활용하면 다음과 같이 작성할 수 있습니다:
안녕하세요, 테라폼과 앤서블을 사용하여 인프라를 설정하고 배포를 자동화하고자 합니다.

1. 테라폼을 사용하여 AWS에 VPC를 생성하고, 이 VPC 내에 EC2 인스턴스를 생성했습니다.
2. 이제 앤서블을 사용하여 이 EC2 인스턴스에 Nginx를 배포하고 싶습니다.
3. 테라폼과 앤서블 설정 파일의 예시를 제공해 주실 수 있나요?

현재 작성한 테라폼 코드와 앤서블 플레이북은 아래와 같습니다:

```python
hcl
# VPC 생성 테라폼 코드
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}
# 앤서블 플레이북
- name: Install Nginx
  hosts: webservers
  tasks:
    - name: Ensure Nginx is installed
      apt:
        name: nginx
        state: present

create html 구성

IAM을 통해 역할 지정

  • dynamoDB 엑세스 권한
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:PutItem"
      ],
      "Resource": "arn:aws:dynamodb:your-region:your-account-id:table/Surveys"
    }
  ]
}

(인라인 정책 형성으로 역할 생성)

(기존의 정책으로 역할 생성)

dynamoDB table 생성

  • 파티션 키에 SurveyId 입력 후 생성 , 나머지는 기본 설정

Lambda 함수 생성

  • 함수 이름과 런타임을 python 3.12로 지정 후에 생성한 역할 지정하고 함수 생성

  • 밑의 코드를 참조하여 배포할 코드 작성 ( dynamodb table의 이름 지정해주기 )

import json
import boto3
from botocore.exceptions import ClientError

# DynamoDB 클라이언트 생성
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('dynamodb-html')

def lambda_handler(event, context):
    try:
        # API Gateway로부터 전달된 요청 바디를 파싱
        survey = json.loads(event['body'])

        # DynamoDB에 저장할 항목 생성
        item = {
            'SurveyId': survey['title'].replace(' ', '-').lower(),  # Title을 이용하여 SurveyId 생성
            'Title': survey['title'],
            'Description': survey['description'],
            'Questions': survey['questions']
        }

        # DynamoDB 테이블에 항목 추가
        table.put_item(Item=item)

        return {
            'statusCode': 200,
            'headers': {
                'Access-Control-Allow-Origin': '*',  # 모든 도메인에서의 요청을 허용
                'Access-Control-Allow-Headers': 'Content-Type',
                'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
            },
            'body': json.dumps({'message': 'Survey data saved successfully!'})
        }

    except ClientError as e:
        print('Error processing survey:', e.response['Error']['Message'])
        return {
            'statusCode': 500,
            'headers': {
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Headers': 'Content-Type',
                'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
            },
            'body': json.dumps({'message': 'Failed to process survey.'})
        }
    except Exception as e:
        print('Error processing survey:', str(e))
        return {
            'statusCode': 500,
            'headers': {
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Headers': 'Content-Type',
                'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
            },
            'body': json.dumps({'message': 'Failed to process survey.'})
        }

    except Exception as e:
        print('Error processing survey:', str(e))
        return {
            'statusCode': 500,
            'body': json.dumps({'message': 'Failed to process survey.'})
        }

api-gateway 연결

  • REST API 구축 / 이름 지정하고 생성

  • 리소스 생성 ( 이름 지정 )

    • 메서드 생성 / 유형 POST로 지정 후에 프록시 통합 체크 후에 lambda 함수 지정

    • 리소스에서 cors 활성화 ( 기본 설정으로 활성 )

S3 생성

  • 버킷 이름 지정후에 퍼블릭 엑세스 차단을 해제하고 버킷 생성
    • 생성된 버킷의 권한의 정책 편집
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-html/*"
        }
    ]
}
  • 정적 웹사이트 호스팅 활성화
    • 정적 웹사이트 호스팅 활성화 후 create-survey.html 기본 페이지 지정

  • 이미지 업로드

    • create-survey.html의 api-gateway endpoint를 입력해서 저장후에 파일 업로드

    • 파일 업로드 후에 create-survey.html 접속해서 내용 입력 후 저장되는지 확인

0개의 댓글