AutoMation
Last updated
Last updated
💡 octet 을 api 로 연동 하기 위해서는 JWT토큰이 필요 하며 토큰의 수명은 3개월이다 따라서 3개월 이전에 토큰을 교환 해야 한다. 기존에는 구글 달력에 등록을 하고 3개월이 되기 전에 수작업으로 진행을 하다보니 시기를 놓치게 되면 바로 장애로 이어지는 문제점이 있었다.
이에 Octet API 토큰을 자동으로 갱신해 주는 배치 시스템을 개발 하였다.
octet api token = octet id + pw + 만료일자로 구성된것으로 추측 된다.
dev / stg 같은 경우 같은 Domain Endpoint로 되어 있지만 토큰 값에 id가 포함되어 있어
실제 트랜젝션이 account로 분리 된다.
octet api token 자동 변경 script
#!/bin/bash
Slack_URI1="https://hooks.slack.com/services/TCU73U2KC/B03U"
Slack_URI2="https://hooks.slack.com/services/TCU73U2KC/B04GU:
DOMAIN=https://dev.blockchainapi.pro
env=dev
REGION=ap-northeast-2
OT="dorian-service-${env}-secret_octet_api_key_app"
# Octet 기존 Token 값 조회
echo "AWS SSM octet key loading"
OCTET_API_KEY=$(aws ssm get-parameter --region ${REGION} --name "${OT}" --query "Parameter.Value" --with-decryption --output text)
TOKEN_INFO=$(curl -X GET "${DOMAIN}/v1/user/tokeninfo" -H "Authorization: ${OCTET_API_KEY}" |jq -r '.formatDate')
echo "After TOKEN Set Time = ${TOKEN_INFO}"
sleep 3
# Octet 신규 Token 발급 및 교체
TOKEN_SET=v1/user/issue-token
NEW_TOKEN=$(curl -X POST "${DOMAIN}/${TOKEN_SET}" -H "Authorization: ${OCTET_API_KEY}" | jq -r '.token')
sleep 3
echo "PUT SSM octet token value"
aws ssm put-parameter --region ${REGION} --name "${OT}" --value "${NEW_TOKEN}" --type "SecureString" --key-id "alias/dorian-service-${env}" --overwrite
sleep 5
OT="dorian-service-${env}-secret_octet_api_key_app"
OCTET_API_KEY=$(aws ssm get-parameter --region ${REGION} --name "${OT}" --query "Parameter.Value" --with-decryption --output text)
NEW_TOKEN_INFO=$(curl -X GET "${DOMAIN}/v1/user/tokeninfo" -H "Authorization: ${OCTET_API_KEY}" |jq -r .formatDate)
echo "New TOKEN Set Time = ${NEW_TOKEN_INFO}"
SVC=service-${env}-an2-dorian-service-ecs-app
aws ecs update-service --cluster dorian-service-${env} --service ${SVC} --task-definition task-${env}-an2-dorian-service-ecs-app --force-new-deployment --no-cli-pager
sleep 5
#update-service 검증
COUNT=0
while [ $COUNT -lt 15 ]
do
STATUS=(`aws ecs describe-services --cluster dorian-service-${env} --services $SVC --no-cli-pager | jq -r '.services[].deployments[].status'`)
ROLLOUTSTATE=(`aws ecs describe-services --cluster dorian-service-${env} --services $SVC --no-cli-pager | jq -r '.services[].deployments[].rolloutState'`)
UPDATEDTIME=(`aws ecs describe-services --cluster dorian-service-${env} --services $SVC --no-cli-pager | jq -r '.services[].deployments[].updatedAt' | cut -d '.' -f 1`)
echo ${UPDATEDTIME[0]}
UTCTOKST=$(date +%Y-%m-%d\ %H:%M:%S -d "${UPDATEDTIME[0]} 9 hour")
echo $UTCTOKST
if [ ${STATUS[0]} == PRIMARY ]
then
if [ ${ROLLOUTSTATE[0]} == COMPLETED ]
then
MESSAGE=$(echo "재기동 완료 시간은 $UTCTOKST 입니다.")
MSG_TEXT="
[ ${env} ]Octet API Token Change!
Before Token Set Date : ${TOKEN_INFO}
After Token Set Date : ${NEW_TOKEN_INFO}
New Token Value : ${OCTET_API_KEY}
1. Octet API 토큰 업데이트 완료
2. ECS 서비스 업데이트 완료
-> ${MESSAGE}
서비스 점검 부탁 드립니다.
"
curl -X POST --data-urlencode "payload={\"channel\": \"#infra_monitoring\", \"username\": \"DevOpsBot\", \"text\": \"${MSG_TEXT}\" , \"icon_emoji\": \":sonic:\"}" $Slack_URI1
curl -X POST --data-urlencode "payload={\"channel\": \"#dorian-service-infra-monitoring-dev-stg\", \"username\": \"DevOpsBot\", \"text\": \"${MSG_TEXT}\" , \"icon_emoji\": \":sonic:\"}" $Slack_URI2
break
else
COUNT=$(($COUNT+1))
echo $COUNT
fi
fi
sleep 60
done
if [ $COUNT == 15 ]
then
MSG_TEXT_FAIL="
[ ${env} ]Octet API Token Change Failed!
-> ECS 재기동 유효 시간이 초과 되었습니다. K-Stadium DevOps 담당자 확인 부탁 드립니다.
"
curl -X POST --data-urlencode "payload={\"channel\": \"#infra_monitoring\", \"username\": \"DevOpsBot\", \"text\": \"${MSG_TEXT_FAIL}\" , \"icon_emoji\": \":sonic:\"}" $Slack_URI1
curl -X POST --data-urlencode "payload={\"channel\": \"#dorian-service-infra-monitoring-dev-stg\", \"username\": \"DevOpsBot\", \"text\": \"${MSG_TEXT_FAIL}\" , \"icon_emoji\": \":sonic:\"}" $Slack_URI2
fi
octet api token 자동 변경을 위한 Dockerfile
FROM amazon/aws-cli
CMD mkdir /app
WORKDIR /app
COPY . .
ENV REGION ap-northeast-2
ENV DOMAIN https://dev.blockchainapi.pro
ENV env dev
RUN ["yum", "-y", "install", "jq"]
ENTRYPOINT ["/bin/bash", "/app/octet-token-change.sh"]