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