안경잡이개발자

728x90
반응형

  간혹 Composer를 이용하여 라이브러리(Library)를 설치하는 경우 다음과 같은 오류에 마주칠 수 있습니다.

 

proc_open(): fork failed - Cannot allocate memory

 

 

  이 때는 다음과 같이 메모리 제한(Memory Limit) 값을 조정하여 업데이트를 수행해주시면 됩니다.

 

sudo php -dmemory_limit=750M composer.phar update

 

728x90
반응형

728x90
반응형

  AWS SNS 서비스를 활용하면 문자 메시지(SMS) 전송 기능을 쉽고 효과적으로 이용할 수 있습니다.

 

※ AWS SNS로 문자 메시지 전송 ※

 

  SNS 서비스를 검색하여 들어갑니다.

 

 

  SMS 발송 기능을 지원하는 리전(Region)은 정해져 있습니다. 서울(Seoul) 리전에서는 SMS 문자 메시지 발송 기능을 지원하지 않으므로 도쿄 리전을 선택하면 됩니다.

 

 

  이후에 [문자 메시지 게시] 버튼을 눌러서 바로 문자 메시지 전송 테스트를 해 볼 수 있습니다.

 

 

  전화번호를 입력한 뒤에 메시지를 보내 보면, 정상적으로 전송이 완료됩니다.

 

 

※ SDK를 활용하여 프로그램 환경에서 문자 전송 ※

 

① IAM 계정 생성하기

 

  SDK를 활용하면 서버 프로그램에서 문자를 전송하는 등의 기능 구현이 가능합니다. 가장 먼저 해야 할 것은 IAM 계정을 생성하는 것입니다. AWS SNS 서비스에만 접근할 수 있는 별도의 계정을 만들어 줌으로써, 안전하게 관리가 가능합니다.

 

 

  프로그래밍 방식 액세스 버튼을 눌러서, 실제 서버에서 해당 계정에 로그인하는 식으로 처리하시면 됩니다.

 

 

  어떤 정책을 사용할 것이냐 물어보는데요. SNS를 사용하겠다고 설정하시면 됩니다.

 

 

  계정이 생성된 이후에는 액세스 키 ID 비밀 액세스 키를 기록해 놓으시면 됩니다.

 

 

② PHP SDK 사용하기

 

  PHP에서는 Composer를 이용해 AWS SDK를 설치할 수 있습니다. 또한 PHP 5.6 이상인 경우 AWS SDK를 어렵지 않게 사용할 수 있다고 합니다.

 

 

  이제 라이브러리에서 접근할 수 있는 홈 디렉토리에 .aws 폴더를 생성하고, 그 안에 credentials라는 이름의 파일을 만들어서 AWS 계정 키 값을 넣어주시면 됩니다.

 

 

  키 값은 다음과 같은 형태로 넣어주시면 됩니다.

 

[default]
aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID
aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY

 

 

  이제 설정이 완료되었으므로, SNS를 이용할 수 있습니다. 먼저, PHP 소스코드에서 라이브러리를 불러올 때는 다음과 같이 하시면 됩니다.

 

require 'vendor/autoload.php';

use Aws\Sns\SnsClient;
use Aws\Exception\AwsException;

 

  이후에 다음과 같은 코드로 SNS 메시지를 전송할 수 있습니다.

 

$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);
$message = '{보낼 메시지 내용}';
$phone = '{국제 전화 번호}';
try {
    $result = $SnSclient->publish([
        'Message' => $message,
        'PhoneNumber' => $phone,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // 실패했을 시에 오류 메시지를 뱉습니다.
    error_log($e->getMessage());
}

 

  테스트 결과 정상적으로 잘 동작합니다.

 

③ 추가 사항

 

  기본적으로 AWS SMS는 설정이 매우 방어적으로 되어 있습니다. [Text Messaging Preferences] 탭으로 이동을 해보시면, [Edit] 창에서 기본적인 텍스트 전송 설정을 할 수 있습니다.

 

 

  이 때 광고 문자 메시지 등이 아니라, 인증 등의 목적으로 사용자에게 반드시 문자 메시지 전달이 되어야 하는 경우 [Transactional]로 설정을 하셔야 합니다. 또한 [Account Spend Limit]에서 한 달에 사용할 수 있는 최대 금액을 넣을 수 있습니다. 다만, 1달러($)에서 증가하지 않을 것입니다.

 

 

  월별 SMS 지출 한도는 기본적으로 1.00 USD입니다. 이는 대략적으로 30 ~ 60번 정도의 문자 메시지를 보낼 수 있는 한도입니다. 따라서 회사에서 해당 서비스를 운영하고 계신 분이라면, 월별 SMS 지출 한도를 늘이셔야 합니다. (만약 이 사실을 모르고, 서비스를 런칭하신 분이라면 애도를 표합니다. SMS 서비스가 갑자기 동작하지 않아서, 고객들의 폭풍 문의를 받을 수 있습니다. 특히 주말이라면...)

 

  월별 SMS 지출 한도 증가 요청은 Support Center에서 하실 수 있습니다.

 

  참고 글: https://ndb796.tistory.com/291

 

AWS 서비스 한도 증가 요청하는 방법 (AWS 문자 메시지 한도 늘이기)

AWS에서 몇몇 서비스는 의도치 않은 과금을 막기 위해 서비스 한도가 정해져 있습니다. 대표적으로 AWS SNS의 문자 메시지(SMS) 전송 서비스는 기본적으로 한 달에 1달러($) 어치만 사용할 수 있도록 제한되어 있..

ndb796.tistory.com

 

728x90
반응형

728x90
반응형

  ModSecurity 2를 이용하면 Apache 웹 서버의 기본적인 웹 방화벽 설정을 할 수 있습니다. 또한 특정한 요청(Request)에 대한 로그를 진행하는 데에 도움을 얻을 수 있기 때문에 자주 사용됩니다. 대표적으로, 서버 오류를 발생시키는 요청에 대해서는 자동으로 로깅을 진행합니다. (POST 방식의 API의 파라미터를 이상하게 요청하여 500번 응답 코드를 받는 등)

 

  설치는 다음과 같이 할 수 있습니다.

 

sudo apt install libapache2-mod-security2

 

 

  이후에 추천 환경설정 파일을 /etc/modsecurity/modsecurity.conf의 위치로 옮기면, 기본적인 설정 그대로 ModSecurity를 이용할 수 있습니다. 그리고 아파치(Apache) 서버를 재시작합니다.

 

sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo apachectl restart

 

  이후에 /var/log/apache2/modsec_audit.log 파일에 로그 데이터가 기록됩니다. 이를 출력하도록 만들면 다음과 같이 로그가 출력되는 것을 확인할 수 있습니다.

 

tail -f /var/log/apache2/modsec_audit.log

 

 

  물론 자신이 운영하고 있는 서비스에 따라서, 서로 다르게 방화벽 설정을 할 필요가 있기 때문에 실제로 로그가 찍히는 것을 보면서 환경 설정을 바꾸어가면서 쓰면 좋습니다.

728x90
반응형

728x90
반응형

  일반적으로 재직 증명서는 [국민연금 가입 여부]를 이용하여 대신 증명할 수 있습니다.

 

  ▶ 국민연금 웹 사이트: http://www.nps.or.kr/jsppage/main.jsp

 

 

  이후에는 다음과 같이 [공인 인증서 로그인]을 할 수 있습니다.

 

 

  이제 다음과 같이 약관에 동의하고 증명서를 발급할 수 있습니다.

 

 

  다음과 같이 원하는 가입 내역을 선택하여 [프린터 발급]을 할 수 있습니다.

 

728x90
반응형

728x90
반응형

  MySQL을 이용할 때 특정한 컬럼(Column)에 데이터를 삽입할 때 다음과 같은 경고가 나올 때가 있습니다.

 

Data truncated for column ~

 

  'Data Truncated' 경고 메시지는 데이터의 일부분이 잘렸을 때 나오는 메시지입니다. 해당 경고 메시지가 발생하는 원인은 매우 다양하지만, 일반적으로 자료형의 범위를 벗어나는 큰 데이터를 삽입했을 때 해당 경고가 발생합니다.

 

  저는 기존의 TEXT 자료형으로 설정했던 컬럼에 65535 바이트 이상의 크기를 가지는 문자열을 삽입하여 '데이터 잘림'이 발생했습니다. 따라서 다음과 같이 MEDIUMTEXT 자료형으로 크기를 키워서 문제를 해결했습니다.

 

ALTER TABLE {테이블명} MODIFY {컬럼명} MEDIUMTEXT;

 

728x90
반응형

728x90
반응형

  간혹 텍스트(Text)로 작성되어 있는 문서를 HTML로 변환할 필요가 있습니다. 그럴 때 사용하면 좋은 몇 가지 사이트를 소개하고자 합니다. 각 사이트가 제공하는 기능은 서로 비슷하지만 조금씩 다르기 때문에 필요에 따라서 편하게 이용하시면 됩니다.

 

① https://www.textfixer.com/html/convert-text-html.php

 

 

② https://wordtohtml.net

 

 

③ https://wordhtml.com/

 

 

④ https://codebeautify.org/text-to-html-converter

 

 

728x90
반응형

728x90
반응형

  MySQL 워크벤치(Workbench)를 이용할 때 Update 구문을 실행할 때 다음의 오류가 나타날 수 있습니다.

 

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences

 

  MySQL Workbench를 이용할 때는 초기 설정으로 Safe Update 모드 상태로 설정되어 있습니다. 그렇기 때문에 키(Key) 데이터를 기준으로 데이터를 업데이트 하는 것이 아니면 오류가 발생할 수 있습니다. 따라서 특정한 원격 데이터베이스의 데이터를 변경하고자 한다면 Safe Update 모드를 해제할 필요가 있는 것입니다.

 

SET SQL_SAFE_UPDATES = 0;

 

  위 구문을 실행한 뒤에 다시 Update 구문을 실행하면 오류 없이 정상적으로 실행됩니다.

728x90
반응형

728x90
반응형

  AWS S3는 이미지, 동영상 등 다양한 파일을 저장하기 위한 목적으로 사용할 수 있는 서비스입니다. Python에서 AWS S3에 다양한 파일을 업로드하기 위해서는 boto3라는 이름의 라이브러리를 사용해 연동할 수 있습니다. 따라서 실습을 위해 AWS S3 서비스로 이동하여 [버킷 만들기]를 진행하겠습니다.

 

  버킷은 특정한 파일이 저장되는 루트 폴더라고 이해할 수 있습니다.

 

 

  버킷의 이름은 임의대로 설정해줍니다.

 

 

  다른 구성은 기본 설정대로 진행하시고 간단한 실습을 위해 [권한 설정] 탭에서는 모든 체크를 해제해주겠습니다.

 

 

  결과적으로 버킷이 생성된 것을 확인할 수 있습니다.

 

 

  이제 이러한 버킷에 프로그래밍을 이용해서 파일을 업로드하거나 다운로드 받을 수 있습니다. 이 때는 [내 보안 자격 증명]에 들어가시면 됩니다.

 

 

  자격 증명을 생성하실 때에는 IAM Users를 이용하여 [사용자 추가]를 진행하시면 됩니다.

 

 

 

  저는 다음과 같이 사용자 이름을 대충 설정한 뒤에 [프로그래밍 방식 액세스]에 체크했습니다.

 

 

  이후에 정책으로는 [AmazonS3FullAccess]를 선택합니다. S3에 접근할 수 있는 권한이라고 이해하시면 됩니다.

 

 

  결과적으로 사용자가 추가되면 [액세스 키 ID][비밀 액세스 키]를 확인할 수 있습니다.

 

 

  이제 실제로 우리의 컴퓨터에서 파이썬(Python)을 이용하여 AWS S3에 파일을 올리거나 다운로드 받을 수 있습니다. 이 때 2가지 라이브러리가 사용됩니다. 바로 boto3와 awscli입니다. 따라서 두 개를 pip3를 이용하여 설치합니다.

 

 

 

  이제 awscli가 설치 되었으므로 aws configure 명령을 이용하여 AWS 계정 연결을 수행할 수 있습니다.

 

 

  이제 파이썬을 이용하여 우리 AWS 계정의 모든 버킷을 출력하도록 할 수 있습니다.

 

import boto3
s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
    print(bucket.name)

 

 

728x90
반응형

728x90
반응형

  우리는 일반적으로 파이썬(Python)의 다양한 라이브러리를 이용하여 프로그램을 작성합니다. 하지만 AWS Lambda는 파이썬의 기본 라이브러리만 제공합니다. 머신러닝(Machine Learning)이나 크롤링 등을 이용하기 위해서는 추가적인 라이브러리를 사용해야 하므로 별도의 작업이 필요합니다.

 

  AWS Lambda는 라이브러리 파일을 통째로 압축해서 올려서 사용할 수 있도록 제공하고 있습니다. 따라서 한 번 크롤링을 위한 bs4 라이브러리를 이용한 파이썬 예제가 있다고 가정해 보도록 하겠습니다.

 

  아래의 소스코드를 구동시키면 bs4 라이브러리를 이용하여 구글(Google) 메인 페이지에 존재하는 모든 <a> 태그의 텍스트 부분을 크롤링하여 출력하게 됩니다.

 

import urllib.request
from bs4 import BeautifulSoup

url = "https://www.google.com"
soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")
a_tags = soup.find_all("a")
result_list = []
for i in a_tags:
    result_list.append(i.get_text())

print(result_list)

 

  이러한 동작을 하는 API를 AWS Lambda를 이용하여 구현하고 싶다면 어떻게 하면 될까요? 방법은 매우 간단합니다. 먼저 bs4 라이브러리가 사용되므로 이 라이브러리를 패키지 형태로 압축해야 합니다.

 

 

  한 번 위와 같이 하나의 폴더를 만든 뒤에 명령 프롬프트(CMD)를 이용하여 해당 경로에 들어가 보겠습니다. 이후에 bs4를 설치하되 현재 폴더 위치에 설치하도록 -t 옵션을 붙입니다.

 

  pip3 install bs4 -t .

 

 

  이제 현재 폴더의 위치에 있는 모든 파일을 압축하여 bs4.zip 라는 압축 파일을 만듭니다.

 

 

  그러면 bs4.zip 파일이 생성되어 있는 것을 확인할 수 있습니다.

 

 

 

  이제 우리의 AWS Lambda 프로젝트를 확인합니다.

 

 

  이제 [.zip 파일 업로드] 유형을 선택한 뒤에 우리의 bs4.zip 파일을 업로드하면 됩니다.

 

 

  우리가 업로드 한 파일은 말 그대로 bs4 라이브러리를 통째로 압축한 파일이므로 lambda_function.py 파일이 존재하지 않는다고 출력되는 것을 확인할 수 있습니다. 왜냐하면 AWS Lambda의 Python 프로젝트의 기본 핸들러는 lambda_function 파일의 lambda_handler로 설정되어 있기 때문입니다.

 

 

  따라서 [File] 탭을 열어서 하나의 파이썬 파일을 작성하면 됩니다. lambda_function.py라는 이름으로 짓습니다.

 

import json
import urllib.request
from bs4 import BeautifulSoup

def lambda_handler(event, context):
    url = "https://www.google.com"
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")
    a_tags = soup.find_all("a")
    result_list = []
    for i in a_tags:
        result_list.append(i.get_text())
    return {
        'statusCode': 200,
        'body': json.dumps(result_list)
    }

 

  이제 위와 같이 소스코드를 작성합니다. 기본적인 핸들러 함수는 lambda_handler이므로 함수의 이름을 이와 같이 지어줍니다. 매개변수 또한 차례대로 event, context를 넣어주세요. 람다 함수는 어떠한 결과 데이터를 return하는 방식으로 작성해주시면 됩니다.

 

 

  결과적으로 이렇게 만들어진 람다 함수를 테스트하기 위해 [저장] 버튼을 누르시면 됩니다.

 

 

  테스트 결과 실제로 크롤링 결과가 잘 출력되는 것을 확인할 수 있습니다.

728x90
반응형

728x90
반응형

실습을 위해 간단히 폴더 만들어 보기

 

 

압축하기

 

tar -cvf {압축 결과.tar} {압축할 폴더}

 

 

압축 해제

 

tar -xvf {압축 풀 대상.tar}

 

 

728x90
반응형