2022년 7월 22일 금요일

[AWS] LakeFormation Lambda IAM Role 권한설정

 

LakeFormation의

Administrative roles ans tasks 메뉴에서

사용하려는 Lambda role을 Data Lake Administators에 추가해야 한다.


예를 들어 user_AA라는 계정에서 lambda_BB 권한을 추가하려면

user_AA 의 IAM 에서 해당 정책을 추가 한다.


{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "lakeformation:*",

                "cloudtrail:DescribeTrails",

                "cloudtrail:LookupEvents",

                "glue:GetDatabase",

                "glue:GetDatabases",

                "glue:CreateDatabase",

                "glue:UpdateDatabase",

                "glue:DeleteDatabase",

                "glue:GetConnections",

                "glue:SearchTables",

                "glue:GetTable",

                "glue:CreateTable",

                "glue:UpdateTable",

                "glue:DeleteTable",

                "glue:GetTableVersions",

                "glue:GetPartitions",

                "glue:GetTables",

                "glue:GetWorkflow",

                "glue:ListWorkflows",

                "glue:BatchGetWorkflows",

                "glue:DeleteWorkflow",

                "glue:GetWorkflowRuns",

                "glue:StartWorkflowRun",

                "glue:GetWorkflow",

                "s3:ListBucket",

                "s3:GetBucketLocation",

                "s3:ListAllMyBuckets",

                "s3:GetBucketAcl",

                "iam:ListUsers",

                "iam:ListRoles",

                "iam:GetRole",

                "iam:GetRolePolicy"

            ],

            "Resource": "*"

        },

        {

            "Effect": "Allow",

            "Action": [

                "lakeformation:PutDataLakeSettings",

                "lakeformation:GetDataLakeSettings"

            ],

            "Resource": "*"

        }

    ]

}

2022년 7월 17일 일요일

[Architecture] 최신 데이터 인프라 관련 동영상

 

최신 데이터 인프라 정보를 7개의 동영상으로 설명하는 유튜브 동영상

원천소스를 Extract하는 것부터 Transform을 배치 or 실시간 하는 소프트웨어,

DataWarehous, DataLake를 최근 어떻게 구성하는지 설명하고 있다.


국내에서는 자주 사용되는 것 (Airflow, Kafka, Spark )

이외에 이런것도 있다는 것을 알 수 있어 DA설계지 여러 선택폭을 고려할 수 있는

안목을 넓히는데 도움이 되지 않을까 싶다.

https://www.youtube.com/watch?v=g_c742vW8dQ&list=PLL-_zEJctPoJ92HmbGxFv1Pv_ugsggGD2&index=1






[AWS] Athena쿼리 가이드

Athena

FaceBook에서 개발한 오픈소스 인메모리 분산쿼리엔진 Presto를 사용


파티셔닝
- WHERE절 사용시 파티셔닝된 컬럼사용을 우선시하여 쿼리비용 감소
- 파티션 수가 너무 많으면 파티션 메타데이터를 처리하는데 오버헤드가 증가해, 비용과 쿼리속도 저하 (테이블당 최대 10만개 파티션)
- 파티션 수가 너무 적을 시, 참조하는 파티션이 중복되면 파티션의 이점을 살리지 못함
- 데이터가 없는 파티션은, 제거하여 관리


파일 압축과 크기
- 파일압축으로 데이터가 작을 수록 쿼리속도와 S3에서 Athena까지 네트워크 트랙픽 감소
- Parquet, ORC 파일 사용 권장
- 파일사이즈가 작을 경우(128MB 이하), 읽기과정에서 생기는 오버헤드가 많이 일어나고
  파일사이즈가 클경우, 한파일을 다 읽을 때까지 대기해 아테나 병렬기능을 활용하지 못함


ORDER BY 최적화
- Athena Presto엔진은 모든 데이터행을 전송한 다음 정렬을 실행
- 정렬된 위, 아래의 N개 값을 활용하는 경우 LIMIT절 사용하여 비용 및 쿼리 실행 시간 절감


JOINS 최적화
- Athena의 Presto엔진은 왼쪽에서 오른쪽으로 조인을 수행
- 왼쪽에 데이터가 큰 테이블을 지정하고 오른쪽에 작은테이블 지정해야 사용메모리가 적어지고 조회가 빨라짐


GROUP BY 최적화
- group by 쿼리에서 높은 카디널리티를 가지는 순으로 칼럼을 정렬하여 사용
* 카디널리티(Cardinality) : 고유 값이 균등하게 분산된 정도


윈도 함수
- 윈도 함수는 메모리를 많이 사용하므로 PARTITION BY절과 함께 사용을 권장
- 윈도 함수 대신 같은 기능의 다른 쿼리 사용 권장


LIKE
- 문자열에 LIKE '%string%' 보다는 regexp_like() 함수 및 정규표현식 사용하여 비용절감
- '%string%' 보다 '%string' 사용시 스캔데이터 감소


필요한 컬럼만 사용
- Asterisk (*) 사용 지양
- Column의 수를 줄이면 전체 쿼리 실행 파이프 라인을 통해 처리하는 데이터양이 줄어듬


참조 :
https://docs.aws.amazon.com/ko_kr/athena/latest/ug/performance-tuning.html
https://aws.amazon.com/ko/blogs/korea/top-10-performance-tuning-tips-for-amazon-athena/
https://www.upsolver.com/blog/aws-athena-performance-best-practices-performance-tuning-tips
https://jaemunbro.medium.com/aws-athena-presto-query-guide-886ce047d710

2022년 4월 19일 화요일

[ Lambda ] 다른 AWS계정의 S3로 람다 trigger 설정


 

[ 테스트 ]

AAAA계정의 S3에서 파일이 업로드되면

BBBB계정의 Lambda 실행



[ BBBB 계정 ]

1. Lambda 함수가 있는 AWS 계정을 사용하여 Lambda 콘솔에서 함수 페이지를 엽니다.

2. Amazon S3에서 호출할 Lambda 함수의 이름을 선택합니다.

3. 구성 탭에서 권한을 선택합니다.

4. 리소스 기반 정책 창에서 권한 추가를 선택합니다.


5. 정책 문 창에서 AWS 서비스를 선택합니다. 서비스 드롭다운 목록이 나타납니다.

6. 서비스 드롭다운 목록에서 S3를 선택합니다. 더 많은 텍스트 필드가 나타납니다.

7. 소스 계정의 경우 Amazon S3 버킷을 호스팅하는 계정의 AWS 계정 ID를 입력합니다.

8. 소스 ARN에 Amazon S3 버킷의 ARN을 입력합니다. 다음 형식을 사용합니다.

arn:aws:s3:::bucket_name

중요: bucket_name을 Amazon S3 버킷의 이름으로 바꿉니다.




[ AAAA계정 ]

1. AWS Management Console에 로그인한 후 Amazon S3 콘솔을 엽니다.

2. 버킷(Buckets) 목록에서 이벤트를 사용 설정하려는 버킷의 이름을 선택합니다.

3. [속성(Properties)]을 선택합니다.

4. 이벤트 알림(Event Notifications) 섹션으로 이동하여 이벤트 알림 생성(Create event notification)을 선택합니다.

5. 일반 구성(General configuration) 섹션에서 이벤트 알림을 설명하는 이벤트 이름을 지정합니다. 선택적으로 접두사와 접미사를 지정하여 지정된 문자로 끝나는 키가 있는 객체로 알림을 제한할 수도 있습니다.

  • 이벤트 이름(Event name)에 대한 설명을 입력합니다. 이름을 입력하지 않으면 전역 고유 식별자(GUID)가 생성되어 이름에 사용됩니다.
  • (선택 사항) 접두사를 기준으로 이벤트 알림을 필터링하려면 접두사(Prefix)를 입력합니다. 예를 들어 특정 폴더에 파일이 추가될 때만 알림을 받도록 접두사 필터를 설정할 수 있습니다(예: images/).
  • (선택 사항) 접미사를 기준으로 이벤트 알림을 필터링하려면 접미사(Suffix)를 입력합니다.

6. 이벤트 유형(Event types) 섹션에서 알림을 받을 이벤트 유형을 하나 이상 선택합니다.


다양한 이벤트 유형 목록은 SQS, SNS 및 Lambda에 지원되는 이벤트 유형 섹션을 참조하세요. 

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/notification-how-to-event-types-and-destinations.html#supported-notification-event-types )

7. 대상(Destination) 섹션에서 이벤트 알림 대상을 선택합니다.



[ 참조 ]

https://aws.amazon.com/ko/premiumsupport/knowledge-center/lambda-s3-cross-account-function-invoke/

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/enable-event-notifications.html


2022년 4월 12일 화요일

[ AWS ] Athena query 처리량 증가 ( Service Quotas )

 

AWS Athena 사용시, 여러 계정에서 query를 실행할 때

처리량의 한계에 의해 athena rate exceeded 에러가 나타난다.


aws servicequotas를 통해 DDL, DML의 처리량 증가 요청을 한다.

Athena 외에도 DynamoDB, Lambda와 같은 서비스의 할당량을 조정할 수 있다.



servicequotas 콘솔 :

https://ap-northeast-2.console.aws.amazon.com/servicequotas/home/


참조 Doc :

https://docs.aws.amazon.com/ko_kr/general/latest/gr/aws_service_limits.html

2022년 4월 7일 목요일

[ Laravel ] Centos에서 Laravel 설치

 

Centos에서 Laravel 설치


[ APM설치 ]

yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum -y install epel-release yum-utils
yum-config-manager --enable remi-php74
yum install httpd
yum install php php-cli php-bcmath php-bz2 php-common php-curl php-dba php-gd php-json php-mbstring php-opcache php-readline php-soap php-xml php-xmlrpc php-zip php-ctype php-pdo php-redis php-mysql php-imagick php-intl

vi /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

yum install MariaDB-server MariaDB-client
systemctl enable httpd
systemctl enable mariadb


[ Apache /etc/httpd/conf/http.conf 설정 ] (빨간색 추가 및 변경)

LoadModule rewrite_module modules/mod_rewrite.so

<Directory "/home/centos">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

# Virtual hosts
Include conf/extra/httpd-vhosts.conf


[ /etc/httpd/conf/extra/httpd-vhosts.conf 설정 ]

<VirtualHost *:80>
    ServerAdmin mygmail@gmail.com
    DocumentRoot "/home/centos/laravel_project/public"
    ServerName 11.22.333.44
    #ServerAlias 11.22.333.44
    ErrorLog "/home/centos/laravel_project/logs/error_log"
    CustomLog "/home/centos/laravel_project/logs/access_log" common
        <Directory /home/centos/laravel_project/public/>
                AllowOverride All
                Allow from all
        </Directory>
        <Directory /home/centos/laravel_project/storage/>
                AllowOverride All
                Allow from all
        </Directory>
</VirtualHost>


[ 라라벨 설치 ]

timedatectl set-timezone Asia/Seoul
# 라라벨을 인스톨을 제공하는 composer설치
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/bin/
ln -s /usr/bin/composer.phar /usr/bin/composer

# 라라벨 설치
composer global require laravel/installer
echo 'export PATH="$PATH:$HOME/.config/composer/vendor/bin"' >> ~/.bashrc
source .bashrc

# 새 프로젝트 생성
laravel new laravel_project


[ 폴더 권한 변경 ]

1. 라라벨 폴더 경로가 /home/centos/laravel_project 라면 3개폴더 모두 chmod 755
2. chmod -R 777 laravel_project/storage (정확히 framework, logs 폴더때문)


[ 실행 ]

systemctl restart httpd
web url창에 11.22.333.44로 접속


[ 실행 화면 ]






2022년 4월 4일 월요일

[ Python ] AWS boto3를 이용한 S3 Path Wild Card


s3의 list_objects를 이용해 prefix를 사용할 수 있지만, 

prefix안에 wild card를 활용할 순 없다.


s3경로가 s3://my-bucket/country/city/town/20220404/myfile.parquet 일 때

  • Prefix='country/city/town/20220404 ( 0 )
  • Prefix='country/*/*/20220404 ( X ) 


pip install awswrangler 

모듈 설치 후 와일드카드를 사용한 S3경로로 필터링 가능


[ Sample Code ]

import boto3
import awswrangler

BUCKET = 'my-bucket' 
S3_PATH = 'country/*/*/20220404/*

s3_paths = awswrangler.s3.list_objects(f's3://{BUCKET}/{S3_PATH}')
for path in s3_paths:
    print(path)



2022년 3월 29일 화요일

[ Python ] AES 양방향 암호화

 

모듈 설치

$ pip install pycryptodome


파이썬 코드

import base64
from Crypto import Random
from Crypto.Cipher import AES

class AES256():

    def __init__(self, key):
        self.bs = 128
        self.key = key.encode('utf-8')
        self.key = AES256.str_to_bytes(key)

    @staticmethod
    def str_to_bytes(data):
        u_type = type(b''.decode('utf8'))
        if isinstance(data, u_type):
            return data.encode('utf8')
        return data

    def _pad(self, s):
        return s + (self.bs - len(s) % self.bs) * AES256.str_to_bytes(chr(self.bs - len(s)%self.bs))

    @staticmethod
    def _unpad(s):
        return s[:-ord(s[len(s)-1:])]

    def encrypt(self, raw):
        raw = self._pad(AES256.str_to_bytes(raw))
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return base64.b64encode(iv + cipher.encrypt(raw)).decode('utf-8')

    def decrypt(self, enc):
        enc = base64.b64decode(enc)
        iv = enc[:AES.block_size]
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return self._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')


aes256 = AES256('mypassword')
e_aes256 = aes.encrypt('password_encrypt')
print(e_aes256)    # VvDWrD2aDyc+2rsdfDhDKosnc2odl2HD2
print(aes256.decrypt(e_aes256))    # password_encrypt



2022년 3월 16일 수요일

[ Python ] No module named 'numpy.core._multiarray_umath' Error


[ 에러 ] 

numpy패키지 설치시 발생 



[ 원인 ]

1. Numpy가 지원하는 최신 Python version은 3.8로 3.9버전 이상 사용시 에러

2. 윈도우(개발환경)에서 pip install numpy로 설치한 패키지는 리눅스에서 컴파일이 안되므로, 

powershell이나 hyper-v를 통해 numpy를 재설치



2022년 3월 14일 월요일

[ Lambda ] 다른 계정의 IAM권한 사용


다른 계정의 IAM을 사용하여 

Lambda함수에서 다른계정의 S3, Athena, Glue 등을 컨트롤 

예제 : AAAA 계정의 람다함수를 통해 BBBB계정의 S3와 athena, glue테이블에 접근



[ 1 ] AAAA 계정에서 람다를 실행하는 iam role(my-lambda-etl-role)에 

AccessCrossIAMBBBB라는 정책을 생성한 후, 아래 스크립트 추가

(기존 role에 추가시 policy로 생성 후 연동)

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::BBBB:role/bbbb-lambda-etl-role"
} }



[ 2 ] BBBB 계정에서 'bbbb-lambda-etl-role' im role에 

신뢰 관계 탭에서 아래 스크립트 추가

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AAAA:role/service-role/aaaa-lambda-etl-role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

권한 탭에서 AAAA계정이 접근할 서비스 추가 (S3, Athena, Glue)




[ 3 ] AAAA계정의 lambda에서 코드 작성

# 샘플코드

def lambda_handler(event, context):
    print('start function')

    sts_connection = boto3.client('sts')
    acct_b = sts_connection.assume_role(
        RoleArn="arn:aws:iam::BBBB:role/role-on-source-account",
        RoleSessionName="cross_acct_lambda"
    )

    ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
    SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
    SESSION_TOKEN = acct_b['Credentials']['SessionToken']


    # create service client using the assumed role credentials
    session = boto3.Session(
        aws_access_key_id=ACCESS_KEY,
        aws_secret_access_key=SECRET_KEY,
        aws_session_token=SESSION_TOKEN,
    )



[ 4 ] LakeFormation 사용시

각 계정에서 role에 대한 table/location 공유설정


[ 5 ] 참조하는 BBBB계정의 S3 권한 설정

버킷->권한->버킷정책

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateS3Access", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AAAA:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::my-bucket-name/*", "arn:aws:s3:::my-bucket-name" ] } ] }




참조 : 
https://aws.amazon.com/ko/premiumsupport/knowledge-center/lambda-function-assume-iam-role/?nc1=h_ls

2022년 3월 6일 일요일

[ Docker ] 도커파일

[ 도커파일이란? ]

  • Docker상에서 실행시킬 컨테이너의 구성 정보(미들웨어, OS, 어플리케이션 등)을 기술하기 위한 파일
  • 확장자는 필요없음
  • Dockerfile이란 파일명 말고 다른 파일명으로 쓸 수 있지만 build시 명시해줘야 함



[ Docker File을 이용한 Sample ]

Dockerfile

# 베이스 이미지 설정

FROM ubuntu:latest

(or dighests로 지정: FROM ubuntu@sha256:se21f... )


# Nginx 설치

RUN apt-get update && apt-get install -y -q nginx


# 파일 복사

COPY index.html /usr/share/nginx/html


# Nginx 시작

CMD ["nginx", "-g", "daemon off;"]


도커 build

# 도커 파일 build

$ docker build -t webapp:1.0 /dockerfile_path


# 빌드된 이미지 실행

$ docker run -d --name "web_nginx" -p 80:80 webapp


[ 도커파일 작성 명령어 ]

RUN

# Shell 형식으로 bin/sh 를 거쳐서 실행

RUN apt-get install -y nginx

# Shell을 경유하지 않고 실행

RUN ["/bin/bash","-c","apt-get install -y nginx"]


CMD

이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행

하나만 지정 가능하며, 여러 개 지정 시 마지막 명령만 유효

# 베이스 이미지 설정

FROM ubuntu:16.04

# Nginx설치

RUN apt-get -y install nginx

# 포트 지정

EXPOSE 80

# 서버 실행

CMD nginx -g 'daemon off;'  [or]  CMD ["nginx", "-g", "daemon off;"]


ENTRYPOINT

docker container run 명령을 실행했을 때 실행

# Docker file

# 베이스 이미지 설정

FROM ubuntu:16.04


# top 실행

ENTRYPOINT ["top"]

CMD ["-d", "10"]

실행

# CMD 명령에서 지정한 10초 간격

$ docker run -it --name sample sample-app

# 인자를 다시 주어 2초 간격으로 갱신

$ docker run -it --name sample sample-app -d 2



ONBUILD

ONBUILD 구문을 포함한 Dockerfile이 다음 빌드에서 

베이스 이미지로 설정 하였을 때, ONBUILD로 지정한 명령어를 설정

1.베이스 이미지 작성(Dockerfile.base)

# 베이스 이미지 설정

FROM ubuntu:16.04

# Nginx 설치

RUN apt-get -y update && apt-get -y upgrade

RUN apt-get -y install nginx

# 포트 지정

EXPOSE 80

# 웹 콘텐츠 배치

ONBUILD ADD website.tar /var/www/html

# Nginx 실행

CMD nginx -g "daemon off;'

 2. 베이스 이미지 빌드

$ docker build -t web-base -f Dockerfile.base .

3. 본 이미지  작성

From web-base

4. 본 이미지 빌드

$ docker build -t web-app .

$ docker run -d -p 80:80 web-app

# 이후 website.tar로 구성된 html, css 화면이 나오는지 확인


STOPSIGNAL

컨테이너를 종료할 때 송신하는 시그널 설정

STOPSIGNAL [시그널]


HEALTHCHECK

컨테이너 안에 프로세스 정상 작동 확인

#5분마다 가용 중인 웹서버를 5초 안에 표시할 수 있는지 확인

HEALTHCHECK --interval=5m(체크간격) --timeout=5s (체크타임아웃) CMD curl -f http://localhost/ || exit1

# 헬스 체크 결과는 docker contain inspect로 확인


ENV

key value형태로 환경변수 설정

# Docker file

ENV myName = "42 fire user" \   

    myOrder = book\ desck\ chair \

지정한 환경변수 변경시

docker run --env를 통해


WORKDIR

작업용 디렉토리 지정, 없으면 새로 생성

# Docker file

ENV DIRPATH second

WORKDIR /first/$DIRPATH


USER

도커파일의 명령어를 실행 할 사용자 지정

# Docker file

RUN ["adduser", "42F"]

RUN ["whoami"]      # root

USER 42F

RUN ["whoami"]      #42F


EXPOSE

실행 중인 컨테이너의 공개 포트 지정

# Docker file

EXPOSE 8080     # docker run -p 로도 설정 가능


ARG

도커파일 안에서 사용할 변수를 정의

# Docker file

ARG MYNAME = "42F"

RUN echo $MYNAME

실행 시

$ docker build . --build-arg    # MYNAME = "42F"

$ docker build . -build-arg MYNAME=70F    # MYNAME이 정의 되었어도 "70F"로 변수 재정의 됨


ADD

빌드 시, 이미지에 파일이나 디렉토리를 추가

# Docker file

ADD host.txt /docker_dir/


# 파일명 패턴 사용

ADD ho* /docker_dir/

ADD hos?.txt /docker_dir       # ? : 임의의 한 문자


# WORKDIR 명령어와 같이 사용 (경로 : /docker_dir/web/ ) cd역할

WORKDIR /docker_dir

ADD host.html /web


# 원격 파일 추가

ADD http://www.site.com/index.php /docekr_dir/web/

# 퍼미션이 600인 파일이 추가, URL을 통해 다운로드시 인증이 필요한 경우면 wget, curl을 사용


VOLUME

이미지에 볼륨을 추가

# Docker file

VOLUME /Mount PATH




2022년 2월 25일 금요일

[ Docker ] 명령어 (네트워크)

도커 네트워크

# 네트워크 목록 확인 (기본적으로 bridge, host, none 세 개의 네트워크가 셋팅)

$ docker network ls


# 컨테이너 상세스펙 조회 (Networks 부분 살펴보기, default = bridge)

$ docker inspect webserver


# 네트워크 생성

$ docker network create -d=bridge my-network

네트워크 생성 확인

$ docker network ls -f driver=bridge 


# 네트워크 연결

docker network connect[disconnect] my-network webserver

# 컨테이너 시작 시 연결

$ docker run -itd --name=webserver --net=my-network nginx


# 네트워크 상세정보 확인 (해당 네트워크를 사용하고 있는 컨테이너도 확인 가능)

$ docker network inspect my-network


# 네트워크 삭제

$ docker network rm my-network


2022년 2월 24일 목요일

[ Docker ] 명령어 ( container 관련 )


도커 컨테이너 생성 및 시작

# 컨테이너 생성 (이미지에 포함되는 디렉토리와 파일들의 스냅샷을 생성, 시작하진 않음)

$ docker create -name webserver nginx


# 컨테이너 생성 및 시작

$ docker run [-d:백그라운드 실행, -i:표준입력 열기, -t:tty 디바이스사용] webserver


# 컨테이너 생성 및 시작 후, 컨테이너에서 bash사용 가능한 대화모드

$ docker run -it --name "web" nginx /bin/bash


# 컨테이너 백그라운드로 실행 후 인수(ping명령어) 실행

$ docker run -d nginx -u root /bin/ping localhost (실행 후 컨테이너 종료)

$ docker run -d --rm nginx /bin/ping localhost (실행 후 컨테이너 삭제)


# 컨테이너 백그라운드 실행 인수 로그 확인

$ docker logs {container_id}


# 컨테이너 시작 

$ docker start webserver


# 컨테이너 중지

$ docker stop webserver


# 컨테이너 삭제

$ docker rm [-f:실행 중 컨테이너 강제 삭제] webserver


도커 컨테이너 네트워크

# 컨테이너 포트 맵핑

$ docker run -d -p 8080:80 nginx


# 컨테이너 dns 서버 지정

$ docker run -d --dns 192.168.1.100 nginx


# 컨테이너 호스트명 지정

$ docker run -h test.server --add-host test.client:192.168.1.2 nginx (/etc/hosts 를 확인)


# host os와 docker의 네트워크 연결을 bridge, --net 옵션 사용하여 변경사능

# 브릿지연결 | 네트워크x | 다른 컨테이너 네트워크 | 호스트OS 네트워크 | 사용자정의 네트워크

$ --net=[bridge | none | containser:<name | id> | host | NETWORK ]


도커 컨테이너 실행환경

# 자원을 지정하여 컨테이너 실행

# 옵션:  -c[cpu비율] -m[메모리] -v[호스트와 디렉토리공유]

$ docker run -c=512[기본비율 1024] -m=2g -v /user/home/:/usr/share/nginx/html nginx


# 환경변수 설정

$ docker run -it -e=env_list nginx /bin/bash


# 작업디렉토리 설정

# docker run -it -w=/my_home nginx /bin/bash


도커 컨테이너 조작

# 컨테이너 조회

$ docker ls [-a: 정지 중 인 컨테이너도 표시] [-f name:test : 이름으로 컨테이너 필터링]


# 컨테이너 상태 확인

$ docker stats webserver


# 실행 중인 컨테이너에 echo 실행

$ docker exec -it webserver /bin/echo "hello world"


# 실행 중 프로세스 확인

$ docker top webserver


# 컨테이너에서 프로세스가 전송되고 있는 포트 확인

$ docker port webserver
80/tcp -> 0.0.0.0:80


# 컨테이너 이름 변경

$ docker rename old_name new_name


# 컨테이너 안의 파일 복사

$ docker cp ./test.txt webserver:/tmp/test.txt


# 이미지 생성부터 컨테이너가 달라진 점(차분) 확인 [A:추가 D:삭제 C:수정]

$ docker diff webserver

C /run
A /run/nginx.pid
C /etc
C /etc/nginx
C /etc/nginx/conf.d


도커 컨테이너 추출

# 컨테이너로부터 이미지 작성

$ docker commit -a(작성자) "42Fire" -m(메세지) "nginx server" webserver 42Fire/nginx_web:v1

# 이미지 생성 확인

$ docker image inspect 42Fire/nginx_web:v1


# 컨테이너를 tar파일로 출력

$ docker export webserver > werb.tar

# tar파일로부터 이미지 작성

$ cat web.tar | docker import - 42Fire/webserver:v1


# 불필요 이미지/컨테이너 일괄 삭제

$ docker system prune -a(사용하지 않는 리소스 모두)


도커 볼륨과 마운트

참조 : https://www.daleseo.com/docker-volumes-bind-mounts/


[ AWS ] Python에서 Lambda 함수 실행 (with boto3)


boto3를 이용한 Lambda함수 실행  

import json

import sys

import boto3


params = {"username": username"info_list": [{"phone": phone, "age": age}]}

client = boto3.client(service_name='lambda', region_name="ap-northeast-2")

client.invoke(FunctionName="my_func", InvocationType='Event', Payload=json.dumps(params))


invoke 옵션

response = client.invoke(

    FunctionName='string',

    InvocationType='Event'|'RequestResponse'|'DryRun',

    LogType='None'|'Tail',

    ClientContext='string',

    Payload=b'bytes'|file,

    Qualifier='string'

)

Description

FunctionName : 람다 함수 이름

InvocationType : 

- Event : 비동기식으로 호출

- RequestResponse : 동기식으로 호출

- DryRun : 매개변수 값을 확인, 사용자or역할에 함수를 호출할 수 있는 권한 확인

LogType : AWS CloudTrail에 실행로그를 남짐. 동기식 호출에만 적용

Payload : 람다 함수에 Json으로 input 제공

Qualifier : 호출 할 함수 버전 또는 별칭을 지정



https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda.html#Lambda.Client.invoke

2022년 2월 23일 수요일

[ Docker ] 명령어 ( image 관련 )

 

도커 실행환경의 상세설정 

$ docker system info

Client:

 Context:    default

 Debug Mode: false

 Plugins:

  buildx: Build with BuildKit (Docker Inc., v0.6.3)

  compose: Docker Compose (Docker Inc., v2.0.0)

  scan: Docker Scan (Docker Inc., v0.8.0)

Server:

 Containers: 0

  Running: 0

  Paused: 0

  Stopped: 0

 Images: 15 ...


도커 디스크 이용상황

$ docker system df

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE

Images          8         0         7.751GB   7.751GB (100%)

Containers      0         0         0B        0B

Local Volumes   29        0         785.6MB   785.6MB (100%)

Build Cache     6         0         0B        0B


웹 서버 실행 예제

# 이미지 다운로드

$ docker pull nginx


# 다운로드 이미지 확인

$ docker image ls  


# 컨테이너 실행 (웹에서 확인 localhost:80) 

$ docker run --name webserver -d -p 80:80 nginx


# 컨테이너 상태 확인

$ docker ps

CONTAINER    ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

c167    nginx    "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp   webserver


# 실시간 컨테이너 상태 확인

$ docker stats webserver

CONTAINER   ID   NAME   CPU %   MEM   USAGE / LIMIT   MEM %   NET I/O   BLOCK I/O   PIDS

c167   webserver   0.00%     6.707MiB / 3.83GiB   0.17%     4.03kB / 2.5kB   0B / 0B   9


# 컨테이너 정지 및 시작

$ docker stop webserver

$ docker start webserver


도커 이미지 조작

 실행 예제

# 특정 태그(버전)의 이미지 다운

$ docker pull centos:7


# 모든 태그 이미지 다운

$ docker pull -a centos


# 모든 이미지 목록 조회 (+중간파일 )

$ docker image ls -a


# 이미지 목록에 다이제스트 포함 조회

$ docker image ls --digests


# 이미지 검색

$ docker search --limit 5 airflow


$ 이미지 조건 검색

$ docker search --filter=stars=100 airflow


# 이미지 삭제

$ docker image rm


# 사용하지 않는 이미지 모두 삭제

$ docker image prune -a


# 이미지 docker hub에 업로드

$ docker login

$ docker image push 이미지명[:태그명]


# 이미지 생성 시 명령어 실행 히스토리

$ docker history image_name


2022년 2월 17일 목요일

[ AWS ] CloudWatch Event를 통해 Lambda Trigger 생성

 

Awsconsole -> Cloudwatch -> 좌측메뉴 -> 이벤트 -> 규칙 -> 규칙생성


1. 패턴을 이용한 Event 생성

예시는 특정 Glue job이 끝나면 Lambda함수 시작하는 Trigger Event 생성

a) 서비스 이름/ 이벤트 유형을 선택한다.



b) 이벤트 패턴을 작성

{

  "source": [

    "aws.glue"

  ],

  "detail-type":[

    "Glue Job State Change"

  ],

  "detail": {

    "state": [

      "SUCCEEDED"

    ],

    "jobName": [

        "GlueJobName"

    ]

  }

}

참조 : https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/events/EventTypes.html#glue-event-types


c) 우측의 대상추가에서 트리거로 실행할 Lambda함수 선택



2. 일정을 이용한 Event 생성

crontab 표현식 작성 부분만 다를 뿐 1번과 같다.



마지막으로 작성한 cloudwatch event role을 

lambda함수의 trigger로 등록하면 된다






2022년 2월 16일 수요일

[ Docker ] wsl을 통한 메모리 관리

 

windows에서 docker사용 시 .wslconfig file을 통해 docker메모리를 관리한다.


C:\Users\{Name} 경로에 .wslconfig 파일을 생성 후 내용 추가

[wsl2]

memory=4GB

swap=0

 

power shell에서 해당 서비스 재시작 후 

Restart-Service LxssManager


변경 사항 확인

ubuntu shell : free -h