728x90
반응형
  1. 에러 로그 확인kern 로그를 보면 위와 같이 하드웨어 에러가 떨어져 있다.
  2. [test] root@crp-san-xenserver07 /var/log 07:18 오전 root # tail -30 kern.log Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592903] {1}[Hardware Error]: It has been corrected by h/w and requires no further action Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592904] {1}[Hardware Error]: event severity: corrected Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592905] {1}[Hardware Error]: Error 0, type: corrected Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592906] {1}[Hardware Error]: fru_text: B1 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592907] {1}[Hardware Error]: section_type: memory error Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592907] {1}[Hardware Error]: error_status: 0x0000000000000400 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592908] {1}[Hardware Error]: physical_address: 0x0000002be8411480 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592910] {1}[Hardware Error]: node: 2 card: 0 module: 0 rank: 1 bank: 1 device: 4 row: 22160 column: 88 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592910] {1}[Hardware Error]: error_type: 2, single-bit ECC Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592911] {1}[Hardware Error]: DIMM location: not present. DMI handle: 0x0000 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592948] {2}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 65534 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592948] {2}[Hardware Error]: It has been corrected by h/w and requires no further action Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592949] {2}[Hardware Error]: event severity: corrected Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592949] {2}[Hardware Error]: Error 0, type: corrected Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592950] {2}[Hardware Error]: section type: unknown, 330f1140-72a5-11df-9690-0002a5d5c51b Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592951] {2}[Hardware Error]: section length: 0x38 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592956] {2}[Hardware Error]: 00000000: 01010001 00000000 e8411000 0000002b ..........A.+... Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592962] {2}[Hardware Error]: 00000010: 00001000 00000000 e8411fff 0000002b ..........A.+... Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592966] {2}[Hardware Error]: 00000020: 00000080 00000000 00000000 00000000 ................ Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592968] {2}[Hardware Error]: 00000030: 00000000 00000000 ........ Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592975] mce: [Hardware Error]: Machine check events logged Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592998] EDAC skx MC2: HANDLING MCE MEMORY ERROR Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592999] EDAC skx MC2: CPU 0: Machine Check Event: 0 Bank 255: 940000000000009f Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.593000] EDAC skx MC2: TSC 0 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.593001] EDAC skx MC2: ADDR 2be8411480 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.593002] EDAC skx MC2: MISC 0 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.593002] EDAC skx MC2: PROCESSOR 0:50657 TIME 1666471643 SOCKET 0 APIC 0 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.593010] EDAC MC2: 0 CE memory read error on CPU_SrcID#1_MC#0_Chan#0_DIMM#0 (channel:0 slot:0 page:0x2be8411 offset:0x480 grain:32 syndrome:0x0 - err_code:0000:009f socket:1 imc:0 rank:1 bg:0 ba:1 row:5690 col:58) Oct 23 06:07:29 crp-san-xenserver07.test.co.kr kernel: [2909958.818467] UDP Refuse: IN=xenbr0 OUT= MAC=ff:ff:ff:ff:ff:ff:c6:c3:9a:b4:3a:26:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=317 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=68 DPT=67 LEN=297 Oct 23 07:07:40 crp-san-xenserver07.test.co.kr kernel: [2913569.427245] UDP Refuse: IN=xenbr0 OUT= MAC=ff:ff:ff:ff:ff:ff:c6:c3:9a:b4:3a:26:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=317 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=68 DPT=67 LEN=297
  3.  EDAC
    • 하드웨어 에러검출 및 정정을 지원하는 Linux Kernel Module 중 하나이다.
    • PCI 버스 전송에러 및 주변 장치 에러검출도 지원
    • MCE 관련 로그는 OS의 메모리 모니터링 기술 EDAC 기능에 의해 기록되는데 이 기술은 하드웨어의 메모리 모니터링 기술보다 정밀하지 못하다.간혹 실제 오류가 없음에도 OS의 EDAC의 민감한 엔진에 의해 오류로 기록되는 경우가 있다.
    • 메시지 발생 시 하드웨어 정보(iLO,IML)을 통해 중복 확인하여 이상이 없는 경우 해당 메시지는 무시하거나 OS의 MCE 감지 기능을 비활성화 하는 것이 좋다.
    •  
728x90

Types of errors

  • Correctable Error (CE) - the error detection mechanism detected and corrected the error. Such errors are usually not fatal, although some Kernel mechanisms allow the system administrator to consider them as fatal.
  • Uncorrected Error (UE) - the amount of errors happened above the error correction threshold, and the system was unable to auto-correct.
  • Fatal Error - when an UE error happens on a critical component of the system (for example, a piece of the Kernel got corrupted by an UE), the only reliable way to avoid data corruption is to hang or reboot the machine.
  • Non-fatal Error - when an UE error happens on an unused component, like a CPU in power down state or an unused memory bank, the system may still run, eventually replacing the affected hardware by a hot spare, if available.
  1. 해당 로그를 보면 ce memory read error로 나타난다.ce 이벤트는 수정가능한 오류이지만 자주 발생하거나 빈도가 잦으면 교체가 필요하다
  2. EDAC는 어떤 메모리 행 또는 채널이 참조하는지에 대한 정보를 제공하지 않으므로 아래와 같이 조사를 해서 조금 더 알아 볼수 있음

Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592998] EDAC skx MC2: HANDLING MCE MEMORY ERROR Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.592999] EDAC skx MC2: CPU 0: Machine Check Event: 0 Bank 255: 940000000000009f Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.593000] EDAC skx MC2: TSC 0 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.593001] EDAC skx MC2: ADDR 2be8411480 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.593002] EDAC skx MC2: MISC 0 Oct 23 05:47:23 crp-san-xenserver07.test.co.kr kernel: [2908752.593002] EDAC skx MC2: PROCESSOR 0:50657 TIME 1666471643 SOCKET 0 APIC 0 # mc2에서 발생한 것을 위 커널로그로 확인 cd /sys/devices/system/edac/mc root # ls -ltr 합계 0 -rw-r--r-- 1 root root 4096 10월 23 07:22 uevent drwxr-xr-x 2 root root 0 10월 23 07:23 power drwxr-xr-x 7 root root 0 10월 23 07:23 mc2 drwxr-xr-x 7 root root 0 10월 23 07:23 mc0 lrwxrwxrwx 1 root root 0 10월 23 07:23 subsystem -> ../../../../bus/edac drwxr-xr-x 7 root root 0 10월 23 07:23 mc3 drwxr-xr-x 7 root root 0 10월 23 07:23 mc1 root # cd mc2 [test] root@crp-san-xenserver07 /sys/devices/system/edac/mc/mc2 07:45 오전 root # ls ce_count ce_noinfo_count dimm0 dimm1 dimm2 dimm3 max_location mc_name power reset_counters seconds_since_reset size_mb subsystem ue_count ue_noinfo_count uevent 해당 로케이션에서 ce_count나 dimm* 안에 ce_count가 있는 것을 확인 할 수 있다. [test] root@crp-san-xenserver07 /sys/devices/system/edac/mc 07:43 오전 root # cat mc*/dimm*/dimm_ce_count 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

추가적으로 lshw나 lspci, dmidecode로 추가적으로 살펴볼 수 있다.

  1. lshw *-memory description: System Memory physical id: 1000 slot: System board or motherboard size: 256GiB capacity: 7680GiB capabilities: ecc configuration: errordetection=multi-bit-ecc *-bank:0 description: DIMM DDR4 Synchronous Registered (Buffered) 2933 MHz (0.3 ns) product: HMA82GR7CJR8N-WM vendor: 00AD063200AD physical id: 0 serial: 127D8C2F slot: A1 size: 16GiB width: 64 bits clock: 2933MHz (0.3ns) *-bank:1 description: DIMM DDR4 Synchronous Registered (Buffered) 2933 MHz (0.3 ns) product: HMA82GR7CJR8N-WM vendor: 00AD063200AD physical id: 1 serial: 127D8C17 slot: A2 size: 16GiB width: 64 bits clock: 2933MHz (0.3ns) # bank 넘버나 slot에 대해서 확인 할 수 있음. # 로그에서는 bank:255 라고 나타났는데 lshw에서 255는 찾아볼 수 없었음 # EDAC skx MC2: HANDLING MCE MEMORY ERROR # EDAC skx MC2: CPU 0: Machine Check Event: 0 Bank 255: 940000000000009f
  2. 나중에 다른 형태로 발생한 로그에 대해서 해당 페이지를 이어서 업데이트 할 필요가 있음

 

728x90
300x250
728x90
반응형

SSL이 아닌 SMTP 메일 서버로 SSL 보안 연결을 제공하기 위해 stunnel을 사용할 수 있습니다. SMTP 서버는 25번 포트로 TCP 접속을 한다 가정하면, stunnel에 SSL 포트로 465로 설정하고 SSL이 아닌 포트를 25로 설정합니다.
즉 SMTPS를 사용하기 위해 사용하는 것이 Stunnel 이다.

 

https://docs.linuxconsulting.mn.it/notes/postfix-stunnel-smtps

/etc/init.d/stunnel

#!/bin/bash
#
# Init Script to run stunnel in daemon mode at boot time.
#
# Author: Riccardo Riva - RPM S.r.l.
# Revision 1.0  -  2010 November, 11
#
# Revision 1.1 - 2015 September, 21
#
#
# Changed definition of SEXE variable to find automatically the path of stunnel
#

#====================================================================
# Run level information:
#
# chkconfig: 2345 99 99
# description: Secure Tunnel
# processname: stunnel
#
# Run "/sbin/chkconfig --add stunnel" to add the Run levels.
# This will setup the symlinks and set the process to run at boot.
#====================================================================

#====================================================================
# Paths and variables and system checks.

# Source function library
. /etc/rc.d/init.d/functions

# Check that networking is up.
#
[ ${NETWORKING} ="yes" ] || exit 0

# Path to the executable.
#
SEXE=`which stunnel`

# Path to the configuration file.
#
CONF=/etc/stunnel/stunnel.conf

# Check the configuration file exists.
#
if [ ! -f $CONF ]
then
        echo "The configuration file cannot be found!"
        exit 0
fi

# Path to the lock file.
#
LOCK_FILE=/var/lock/subsys/stunnel

#====================================================================

# Run controls:

prog=$"stunnel"

RETVAL=0

# Start stunnel as daemon.
#
start() {
        if [ -f $LOCK_FILE ]
        then
                echo "stunnel is already running!"
                exit 0
        else
                echo -n $"Starting $prog: "
                $SEXE $CONF
        fi

        RETVAL=$?
        [ $RETVAL -eq 0 ] && success
        echo
        [ $RETVAL -eq 0 ] && touch $LOCK_FILE
        return $RETVAL
}

# Stop stunnel.
#
stop() {
        if [ ! -f $LOCK_FILE ]
        then
                echo "stunnel is not running!"
                exit 0

        else

                echo -n $"Shutting down $prog: "
                killproc stunnel
                RETVAL=$?
                [ $RETVAL -eq 0 ]
                rm -f $LOCK_FILE
                echo
                return $RETVAL

        fi
}

# See how we were called.
case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        condrestart)
                if [ -f $LOCK_FILE ]
                then
                        stop
                        start
                        RETVAL=$?
                fi
                ;;
        status)
                status stunnel
                RETVAL=$?
                ;;
        *)
                echo $"Usage: $0 {start|stop|restart|condrestart|status}"
                RETVAL=1
esac

exit $RETVAL

/etc/stunnel/stunnel.conf

output=/var/log/stunnel

[smtp-tls-wrapper]
accept=127.0.0.1:11125
client=yes
sslVersion=TLSv1.2
connect=gw.test.com:465

/etc/postfix/virtual

가장 아래에 추가

root  ldap@test.co.kr
728x90

/etc/postfix/main.tf

윗부분에 
mydomain = test.co.kr

smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

/etc/postfix/sasl_passwd

[gw.test.com]:11125 'mail_sender':'Wjdqh02)@'

위 설정 후 추가로 sasl_passwd.db로 암호화 되게끔 세팅

추가로 SASL 암호화 관련 링크

https://www.spinics.net/lists/cyrus-sasl/msg02896.html

https://blog.sys4.de/cyrus-sasl-ldapdb-man-page-en.html

728x90
300x250
728x90
반응형

개요

SSH를 막고 SSM 사용할 때 웹터미널로만 접속 해야하는데

이런 부분에 대해 Shell를 사용하여 SSM 명령어로 서버 접속하는 방법이다.

Local Profile을 읽어들어서 AssumeRole하여 ec2 서버를 선택 및 접근이 가능하다.

사전에 session-manager-plugin을 설치 해야함

 

 

#!/usr/bin/env bash
# bash -version 4버전 이후부터 실행 가능.

function select_option {

    # little helpers for terminal print control and key input
    ESC=$( printf "\033")
    cursor_blink_on()  { printf "$ESC[?25h"; }
    cursor_blink_off() { printf "$ESC[?25l"; }
    cursor_to()        { printf "$ESC[$1;${2:-1}H"; }
    print_option()     { printf "   $1 "; }
    print_selected()   { printf "> $ESC[7m $1 $ESC[27m"; }
    get_cursor_row()   { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; }
    key_input()        { read -s -n3 key 2>/dev/null >&2
                         if [[ $key = $ESC[A ]]; then echo up;    fi
                         if [[ $key = $ESC[B ]]; then echo down;  fi
                         if [[ $key = ""     ]]; then echo enter; fi; }

    # initially print empty new lines (scroll down if at bottom of screen)
    for opt; do printf "\n"; done

    # determine current screen position for overwriting the options
    local lastrow=`get_cursor_row`
    local startrow=$(($lastrow - $#))

    # ensure cursor and input echoing back on upon a ctrl+c during read -s
    trap "cursor_blink_on; stty echo; printf '\n'; exit" 2
    cursor_blink_off

    local selected=0
    while true; do
        # print options by overwriting the last lines
        local idx=0
        for opt; do
            cursor_to $(($startrow + $idx))
            if [ $idx -eq $selected ]; then
                print_selected "$opt"
            else
                print_option "$opt"
            fi
            ((idx++))
        done

        # user key control
        case `key_input` in
            enter) break;;
            up)    ((selected--));
                   if [ $selected -lt 0 ]; then selected=$(($# - 1)); fi;;
            down)  ((selected++));
                   if [ $selected -ge $# ]; then selected=0; fi;;
        esac
    done

    # cursor position back to normal
    cursor_to $lastrow
    printf "\n"
    cursor_blink_on

    return $selected
}


IAM User Data 불러오기
참고로 query에서 나오는 순서는 알파벳 순이다(A-Z, a-z)
아래와 같이 나열한 순서로 나오지 않고, 혼란스러울 것 같아서 결과를 보고 순서를 맞춰나열한 것 뿐이다.
IAM_PROFILE : iam 사용자의 profile env에 IAM_PROFILE이 있다면 env에 세팅되어 있는 값을 사용하자. 없다면 default로 세팅

if [ "$IAM_PROFILE" = "" ]; then
    IAM_PROFILE="default"
fi
UserInfo=$(aws iam get-user \
--query "User.{
            Email:Tags[?Key=='Email']|[0].Value,
            Name:Tags[?Key=='Name']|[0].Value,
            Profile:Tags[?Key=='SsmProfile']|[0].Value,
            Role:Tags[?Key=='Role']|[0].Value,
            User:UserName
        }"  \
--profile ${IAM_PROFILE} --output text)

if [ -z "${UserInfo}" ]; then
    echo "IAM get-user Fail !!! Who are You ???"
fi

KEYWORD=$1
PROFILE=$2 # PROFILE은 받은 인자 값이 있다면 받은 걸로 지정

EMAIL=$(echo "${UserInfo}" | cut -f1)
NAME=$(echo "${UserInfo}" | cut -f2)

# $UserInfo | cut -f3 에 대한 처리
# 2번째 arg 에 값이 없다면 IAM User의 SsmProfile TAG Value 불러오기(Default Profile 이라고 보면 됨.)
if [ "$PROFILE" = "" ]; then
    PROFILE=$(echo "${UserInfo}" | cut -f3)
    # 해당 TAG가 없다면 PROFILE을 입력받도록 유도.
    if [ "$PROFILE" = "None" ]; then
        read -p 'Enter your profile: ' PROFILE
    fi
fi

ROLE=$(echo "${UserInfo}" | cut -f4)
USERNAME=$(echo "${UserInfo}" | cut -f5)

REGION="ap-northeast-2"

# Welcome Message
echo "Hello !! ${NAME}(${EMAIL})"
echo "Welcome to EC2 SSM !!!"
echo "Your IAM profile is ${IAM_PROFILE}"
echo "Your Role profile is ${PROFILE}."

# $1 KEYWORD 입력 받은게 없다면 입력받기
if [ "$KEYWORD" = "" ]; then
    read -p 'Enter ec2 name keyword: ' KEYWORD
fi

# mng-ssm m mng
# work-dev-ssm wd work-dev
# work-prd-ssm wp work-prd
# b2b-prd-ssm bp b2bp b2b-prd
# b2b-dev-ssm bd b2bd b2b-dev
# pts-ssm p pts
# b2c-prd-ssm cp b2cp b2c-prd
# b2c-dev-ssm cd b2cd b2c-dev
declare -A profile_alias
profile_alias["m"]="mng-ssm"
profile_alias["mng"]="mng-ssm"
profile_alias["mng-ssm"]="mng-ssm"
profile_alias["wd"]="work-dev-ssm"
profile_alias["work-dev"]="work-dev-ssm"
profile_alias["work-dev-ssm"]="work-dev-ssm"
profile_alias["wp"]="work-prd-ssm"
profile_alias["work-prd"]="work-prd-ssm"
profile_alias["work-prd-ssm"]="work-prd-ssm"
profile_alias["bp"]="b2b-prd-ssm"
profile_alias["b2bp"]="b2b-prd-ssm"
profile_alias["b2b-prd"]="b2b-prd-ssm"
profile_alias["b2b-prd-ssm"]="b2b-prd-ssm"
profile_alias["bd"]="b2b-dev-ssm"
profile_alias["b2bd"]="b2b-dev-ssm"
profile_alias["b2b-dev"]="b2b-dev-ssm"
profile_alias["b2b-dev-ssm"]="b2b-dev-ssm"
profile_alias["p"]="pts-ssm"
profile_alias["pts"]="pts-ssm"
profile_alias["pts-ssm"]="pts-ssm"
profile_alias["cp"]="b2c-prd-ssm"
profile_alias["b2cp"]="b2c-prd-ssm"
profile_alias["b2c-prd"]="b2c-prd-ssm"
profile_alias["b2c-prd-ssm"]="b2c-prd-ssm"
profile_alias["cd"]="b2c-dev-ssm"
profile_alias["b2cd"]="b2c-dev-ssm"
profile_alias["b2c-dev"]="b2c-dev-ssm"
profile_alias["b2c-dev-ssm"]="b2c-dev-ssm"

if [[ "${profile_alias[${PROFILE}]}" == "" ]]; then
    echo "This Profile is not Matching !!! (${PROFILE})"
    exit 0
fi

PROFILE=${profile_alias[${PROFILE}]}
echo "Your profile full name is ${PROFILE}"

# PROFILE Define
# profile       account         account-number
# mng-ssm       testCompany-mng      123123
# work-ssm-prd  testCompany-work     123123
# work-ssm-dev  testCompany-work     123123
# b2b-ssm-prd   testCompany-b2b      123123
# b2b-ssm-dev   testCompany-b2b      123123
# pts-ssm       testCompany-b2b      123123
# b2c-ssm-prd   testCompany-b2c      123123
# b2c-ssm-dev   testCompany-b2c-dev  123123
declare -A EC2_SSM_PROFILE_INFO
EC2_SSM_PROFILE_INFO["mng-ssm"]="testCompany-mng:123123"
EC2_SSM_PROFILE_INFO["work-prd-ssm"]="testCompany-work:123123"
EC2_SSM_PROFILE_INFO["work-dev-ssm"]="testCompany-work:123123"
EC2_SSM_PROFILE_INFO["b2b-prd-ssm"]="testCompany-b2b:123123"
EC2_SSM_PROFILE_INFO["b2b-dev-ssm"]="testCompany-b2b:123123"
EC2_SSM_PROFILE_INFO["pts-ssm"]="testCompany-b2b:123123"
EC2_SSM_PROFILE_INFO["b2c-prd-ssm"]="testCompany-b2c:123123"
EC2_SSM_PROFILE_INFO["b2c-dev-ssm"]="testCompany-b2c-dev:123123"

echo ${EC2_SSM_PROFILE_INFO[${PROFILE}]}
ACCOUNT=$(echo ${EC2_SSM_PROFILE_INFO[${PROFILE}]} | cut -f2 -d ":")

role name define : ec2-role-${PROFILE} -> IAM에 role이 존재해야한다.
session name define : ec2-session-${PROFILE} -> session name 임의값으로 지정해주는 것임. 각 프로파일마다 겹치지만 않게 하기 위함.

728x90


해당 프로파일 세션이 유효한지 체크
session name 을 구해와서 비교

session_check=$(aws sts get-caller-identity --profile ${PROFILE} --region ${REGION} --query "{User:UserId}" --output text | cut -f2 -d ":" )

# session 비어있으면 같지 않을 것이기에 같지 않으면으로 조건 걸었음.
if [ "$session_check" != "ec2-session-${PROFILE}" ]; then
    echo "Your session is Empty or Expire ($session_check)"

    while [ -z $OTPCODE ] || [ "${OTPCODE}" = "" ]; do
        read -p 'Enter your MFA code : ' OTPCODE
        if ! [[ ${#OTPCODE} = 6 && "${OTPCODE//[0-9]/}" == "" ]]; then
            echo "It's invalid code ($OTPCODE)"
            OTPCODE=""
        fi
    done

    # AssumeRole (역할 체인지)
    aws_configure=$(aws sts assume-role \
    --role-arn "arn:aws:iam::${ACCOUNT}:role/ec2-role-${PROFILE}" \
    --role-session-name "${USERNAME}-ec2-session-${PROFILE}" \
    --serial-number arn:aws:iam::032559872243:mfa/${USERNAME} \
    --query "Credentials.{
            AccessKeyId:AccessKeyId,
            SecretAccessKey:SecretAccessKey,
            SessionToken:SessionToken
        }" \
    --tags Key=Role,Value=${ROLE} \
    --transitive-tag-keys Role \
    --token-code ${OTPCODE} \
    --output text )

    if [ -z "${aws_configure}" ]; then
        echo "AssumeRole Fail!!!"
        exit 0
    fi

    aws_access_key_id_value=$(echo "${aws_configure}" | cut -f1)
    aws_secret_access_key_value=$(echo "${aws_configure}" | cut -f2)
    aws_session_token_value=$(echo "${aws_configure}" | cut -f3)

    aws configure set aws_access_key_id "${aws_access_key_id_value}" --profile ${PROFILE}
    aws configure set aws_secret_access_key "${aws_secret_access_key_value}" --profile ${PROFILE}
    aws configure set aws_session_token "${aws_session_token_value}" --profile ${PROFILE}
fi

echo "Select one option using up/down keys and enter to confirm:"

# 키워드(KEYWORD)가 1글자인 경우는 무시..
if [[ ${#KEYWORD} = 1 ]]; then
    KEYWORD=""
fi
# 키워드가 숫자 10으로 시작하는 경우 IP검색으로 조건 변경.
if [[ "$KEYWORD" == 10* ]]; then
    echo "If the keyword starts with 10, the condition is changed to an IP lookup."
    filter_condition="Name=private-ip-address,Values='${KEYWORD}*'"
else
    filter_condition="Name=tag:Name,Values='*${KEYWORD}*'"
fi

if [ "${PROFILE}" = "work-prd-ssm" ]; then
    runmode="Name=tag:RunMode,Values=PRD"
elif [ "${PROFILE}" = "work-dev-ssm" ]; then
    runmode="Name=tag:RunMode,Values=DEV"
fi

IFS=$'\n' options=($(aws ec2 describe-instances \
--profile ${PROFILE} \
--region "${REGION}" \
--query "Reservations[*].Instances[*].{aInstance:InstanceId,bState:State.Name,cIp:PrivateIpAddress,dName:Tags[?Key=='Name']|[0].Value}" \
--filters ${filter_condition} ${runmode} \
--output text))

if [ -z "${options}" ]; then
    echo "No Result !!!"
    exit 0
fi

select_option "${options[@]}"
choice=$?

echo "Choosen index = $choice"
echo "        value = ${options[$choice]}"
instance_id=$(echo ${options[$choice]} | cut -f1 )

echo "instance id: ${instance_id}"

aws ssm start-session  \
--profile ${PROFILE} \
--region ${REGION} \
--target ${instance_id}
728x90
300x250
728x90
반응형

개요

그룹웨어 DB인 Postgresql에서 User View Table에 임직원이 추가 되거나 부서 이동 하였을 경우

그룹웨어에 먼저 업데이트 되는데 이 데이터를 긁어와서 LDAP에도 자동으로 업데이트 되도록 List를 추출하는 작업이다

Python으로 임직원 목록을 불러오며, 외주직원은 제외하거나, 퇴사한 직원, 전체 부서 리스트 등을 추출 한다.

#-*- coding: euc-kr -*-
import boto3
import json
import psycopg2
import requests
import sys
import chardet

sys.stdout = open('/usr/share/openldap-servers/userList.json', 'w')

try:
    conn_string = "host='gw.testhub.com' dbname='tims' user='test' password='test2164!@' port='5432'"
    conn = psycopg2.connect(conn_string)
    cur = conn.cursor()
    #qry_origin = "select userid, status, username, mailaddr, deptname, updated_at from view_user where updated_at >= current_timestamp + '-240 minute' and deptcode not like 'E%' and order by updated_at desc"
    qry_origin = "select userid, status, username, mailaddr, deptname, updated_at from view_user where deptcode not like 'E%'"
    qry = u"select row_to_json(tmp) from ("+ qry_origin +") tmp;"
    cur.execute(qry)
    rownum = int(cur.rowcount)
    i=0
    while i < rownum:
        result = cur.fetchone()[0]
        print(json.dumps(result, ensure_ascii=False).encode('utf8'))
        i = i + 1
    cur.close()
    conn.close()
except psycopg2.DatabaseError as db_err:
    print('!!! not connected !!!', db_err)

sys.stdout.close()

sys.stdout = open('/usr/share/openldap-servers/userStopList.json', 'w')

try:
    conn_string = "host='gw.testhub.com' dbname='tims' user='test' password='test2164!@' port='5432'"
    conn = psycopg2.connect(conn_string)
    cur = conn.cursor()
    #qry_origin = "select userid, status, username, mailaddr, updated_at from view_user where updated_at >= current_timestamp + '-240 minute' and status='STOP'"
    qry_origin = "select userid, status, username, mailaddr, updated_at from view_user where status='STOP'"
    qry = u"select row_to_json(tmp) from ("+ qry_origin +") tmp;"
    cur.execute(qry)
    rownum = int(cur.rowcount)
    i=0
    while i < rownum:
        result = cur.fetchone()[0]
        print(json.dumps(result, ensure_ascii=False).encode('utf8'))
        i = i + 1
    cur.close()
    conn.close()
except psycopg2.DatabaseError as db_err:
    print('!!! not connected !!!', db_err)

sys.stdout.close()

sys.stdout = open('/usr/share/openldap-servers/gwTotalGroupList.lst', 'w')

try:
    conn_string = "host='gw.testhub.com' dbname='tims' user='test' password='test2164!@' port='5432'"
    conn = psycopg2.connect(conn_string)
    cur = conn.cursor()
    qry_origin = "select distinct deptcode, deptname from view_user where deptcode not like 'E%'"
    qry = u"select row_to_json(tmp) from ("+ qry_origin +") tmp;"
    cur.execute(qry)
    rownum = int(cur.rowcount)
    i=0
    while i < rownum:
        result = cur.fetchone()[0]
        print(json.dumps(result, ensure_ascii=False).encode('utf8'))
        i = i + 1
    cur.close()
    conn.close()
except psycopg2.DatabaseError as db_err:
    print('!!! not connected !!!', db_err)

sys.stdout.close()

Lambda로도 비슷하게 가능하다.

import boto3
import json
import psycopg2 #PostgreSQL 과 연결하려면 반드시 있어야 되는 드라이버 (람다에서는 레이어 붙이는걸로 처리 가능)
import requests

def lambda_handler(event, context):
    
    print('db connect')
    conn = psycopg2.connect(host='gw.testhub.com', dbname='tims', user='test', password='test2164!@', port='5432') #DB 접속 구문 
    print('db connect success!')
    cur = conn.cursor() #커서 생성 (쿼리 칠 때 필요함)
    print('start query')
    
    qry_origin = "select status, empno, username, mailaddr, deptcode, deptname, dutycode, positionname, dutyname, updated_at from view_user where updated_at >= current_timestamp + '-10 minute' and status like 'STOP' and dutyname is null order by updated_at desc"
    qry = "select row_to_json(tmp) from ("+ qry_origin +") tmp;" #쿼리문 (row_to_json으로 바로 JSON 형식으로 뽑아다줌)
    
    cur.execute(qry) #쿼리 실행
    rownum = int(cur.rowcount)  # DB 총 행 개수 구하기
    print(rownum)
    
    i=0
    while i < rownum: #쿼리 결과 값 나온 행 수 만큼 반복해서 
        result = cur.fetchone()[0] #cur.fetchone()로 한 행 결과값 묶어주기 (fetchall() 을 호출하면 전체 행 값이 나옴) ([0] 을 넣어줘야 대괄호나 괄호가 안생김)
        req_url = requests.post('https://intra.testhub.com:7075/RF_COUNT/minsu/insertUsr', json = result) #결과 값 URL 호출
        print(result)
        print(req_url)
        i = i + 1
   

    cur.close()
    conn.close()
728x90
300x250
728x90
반응형

개요 

도커 빌드 이미지 생성 시 이미지에 대한 Label을 생성할 수 있다.

필요에 따라 해당 Label을 가지고 이미지에 대해 확인 하는 등 처리 할 수 있는 프로세스가 이것저것 생기게 된다.

 

1. FROM 추가

FROM node:10-alpine as build-stage

2. ARG 추가

ARG BUILD_ID
728x90

3. Label 추가

LABEL build=builder_$BUILD_ID

해당 부분을 추가 해줌으로 써 Build에 대한 Label을 지정 해 줄 수 있다.

나머지 구문에 대해서는 생략 하도록 하겠다.

 

728x90
300x250

'IT > Container' 카테고리의 다른 글

Docker cgroupfs에서 systemd로 변경 방법  (0) 2021.09.10
WSL2에서 Docker 설치하기  (0) 2021.09.10
728x90
반응형

6~7년 전 나는 종합건강검진을 받았다.

 

그때 갑상선 초음파 검사도 진행 했었다.

갑상선의 왼쪽에 1.7cm의 결절이 보이는데 모양이 좀 이상하기 때문에 조직검사를 진행 해야 한다고 한다.

조직검사는 갑상선에 있는 조직을 채취해서 검사 기관에 별도 전달 하여, 그 조직에 대해서 검사하여 결과를 받는 것이다.

 

집에 돌아오는 길에 조직검사에 대해 검색 해 보았다.

728x90

이 거대한 주사기를 보는 순간, 

"아, 너무 무서운데...? 이걸 어떻게 하지" 라는 생각을 했다.

 

그래서 그냥 모양만 안 예쁜 것일거야 하고 1년을 보냈다.

1년이 지난 후 근처 갑상선 전문 의원이 있는 곳을 확인 하고,

혹시나 싶어서 초음파 검사를 다시 해 보았다.

 

그때 의사 선생님도 갑상선이 좀 이상한 것 같아서 조직검사를 해 봐야 할 것 같다고 얘기 해주었다.

하지만 그때도 조직검사를 하기 싫어서 의사님께 이것저것 물어보았다.

 

"만약 저 결절이 암이라면 치료가 가능한 것인가요?

  "아니요 감상선 암은 잘라 내는 수 밖에 없습니다.

"그러면 만약 저 결절이 암이라면 초음파에서 표시가 나나요?"

  "네 암이면 바로 나타납니다"

"갑상선 암은 전이가 되나요?"

  "아니요 갑상선 암은 전이가 안됩니다."

"그러면 굳이 조직검사 안 하고,

나중에 추적검사 하다가 암이라고 판단 되면 그때 제거 하는 수술을 진행 할게요"

그러고 나온 후 갑상선에 대해 잊으며 살았다.

 

그리고 5~6년이 지났다.

 

나머지는 이어서 작성하도록 하겠다.

 

 

 

728x90
300x250
728x90
반응형

이전 발행 글 참조

2022.04.25 - [망고로그/생활] - [코로나 후기] 코로나 확진 이틀전 기록

 

[코로나 후기] 코로나 확진 이틀전 기록

3월 4일 나는 어느 때와 다름없이 KF 94 마스크를 착용하고, 지하철을 이용하여 회사에 출근 하였다. 며칠 전 옆 자리에 앉아 있는 팀원이 연인과 함께 데이트를 하다가 감기에 걸렸다고 한다. 대

parkbrother.tistory.com

자가격리 이틀 째, 

처방 받은 약을 전 날 저녁에 먹고 자면 새벽에 깬다.

 

온 몸이 저리고 특히 하체가 굉장히 저렸다 누워 있기가 불편하여 깬 듯 하다.

약 기운이 떨어지면서 다시 저림 현상이 나타나는 거 같았다.

다행히 인후통과 미각, 후각 상실은 없었으며, 가래와 잔 기침과 몸살 기운(저림 현상)이 심했었다.

몸의 온도는 38.5도 까지 상승 하였었다.

 

인후통이 없어서 그런지 식사는 잘 했기 때문에 회복은 빨리 할 수 있을거 같았다.

약을 먹으면 위 증상이 싹 사라진다. 약 기운이 떨어지면 다시 발생하고 반복 하였다.

 

음식은 첫 날에만 죽을 먹었고 그 다음부터는 음식을 가리지 않고 먹었다.

728x90

마지막 날에는 너무 집에만 있고 앉거나 누워만 있어서 그런지, 코로나 후유증인지는 모르겠지만

소파에 앉아 있는데 뭔가 숨쉬기가 힘든 답답함이 있었다.

그리고 심장 쪽이 뭔가 부담 되는 느낌을 계속 받았다.

 

"아, 이대로 계속 있으면 안될 것 같다"

 

옷을 갈아입고 겉 옷을 걸치고 아파트 뒷산으로 올랐다.

 

몸을 좀 움직이고 가벼운 운동을 해야 해소가 될 것 같았다.

 

한 30분~40분 정도 뒷산을 다녀오고 집에 오니 몸이 한결 가벼웠고 답답함이 해소 되었다.

 

다행이란 생각이 들었고 다시 좀 쉬어 주었다.

계속 약먹고 쉬고 가볍게 움직이고 먹고 반복 해야 하는 것 같다. 

너무 집에만 있으니 몸이 더 아픈 느낌이었다.

 

 

 

 

 

 

 

728x90
300x250
728x90
반응형

3월 4일 나는 어느 때와 다름없이 KF 94 마스크를 착용하고, 지하철을 이용하여 회사에 출근 하였다.

 

며칠 전 옆 자리에 앉아 있는 팀원이 연인과 함께 데이트를 하다가 감기에 걸렸다고 한다.

 

대략 2~3일 째 훌쩍 훌쩍 거리고 가끔 기침 하는게 보였다.

 

나는 팀원이 코로나 인게 아닌가 싶었지만, 본인은 여러 번 자가검사 키트로 검사를 했는데 음성이 나왔다고 한다.

 

그래서 단순 감기이구나 싶었다.

오전 업무를 마치고, 팀원들과 함께 배달 음식을 시켜 각자 자리에서 먹도록 하였다.

 

아무래도 그때 당시 신규 확진자가 최고치를 찍었을 때이다.

 

일일 확진자가 24만명 이던 시절이다.

 

그래서 밖에 식당가서 먹기엔 무섭기 때문에 배달로 자리에서 먹는게 안전하다고 판단 했다.

 

다같이 마스크를 벗고 점심을 맛있게 먹었다.

 

그 날 오후 3~4시쯤 이상하게 살짝살짝씩 잔기침이 나기 시작했다.

 

너무 약한 잔기침이라 정말 대수롭지 않게 생각 하였다.

728x90

 

퇴근 후 저녁 8시쯤 집에 가니 이상하게 기운이 없고 뭔가 좀 추운 느낌이 들어서 몸살 감기에 걸린 것 같아,

 

감기약을 먹고 옷 껴입고 전기장판을 킨 후 바로 잠을 잤다.

 

자는데 새벽에 계속 깼다. 새벽에 정신이 깼을 때 몸 상태가 온 몸이 저려오고 숨 쉬는게 좀 답답해서 입으로 크게 내쉬는 행동을 많이 하였다.

 

그러면서 선잠으로 잤던거 같다.

 

3월 5일(토) 새벽 7~8시 쯤 일어나서 뭔가 이상함을 느끼며,

 

코로나 자가검사 키트를 진행 하였다.

 

 

두둥!

 

 

코를 열심히 후비고 면봉을 적시고 한방울, 두방울.. 떨어 뜨렸다.

 

알람을 15분을 맞췄지만, 떨어뜨린 물방울이 양성 표시 줄을 지나가는 순간 

 

15분 기다릴 세 없이 즉시 선명하게 2 줄이 그어졌다.

 

그러고 바로 나는 근처 '호흡기 진료 지정 의료기관 의원' 으로 찾아갔다.

 

바로 신속항원 검사를 받고 일주일 치 약을 처방 받았다.

결과는 3월 6일(일) 다음 날에 나온다고 한다. 

 

근처 본죽 집을 찾아서 죽을 구매 하고 집으로 돌아가서 죽먹고 약먹고 잠만 잤다

 

나의 증상은

 

인후통은 없었으며, 잔기침과 가래, 몸 저림 현상(특히 하체)이 심했다.

 

미각, 후각 정상 이었으며, 밥은 잘 먹었다.

 

다음 후기

2022.04.26 - [망고로그/생활] - [코로나 후기] 코로나 확진 자가격리 기록

 

[코로나 후기] 코로나 확진 자가격리 기록

이전 발행 글 참조 2022.04.25 - [망고로그/생활] - [코로나 후기] 코로나 확진 이틀전 기록 [코로나 후기] 코로나 확진 이틀전 기록 3월 4일 나는 어느 때와 다름없이 KF 94 마스크를 착용하고, 지하철

parkbrother.tistory.com

 

728x90
300x250

+ Recent posts