'전체 글'에 해당하는 글 2049건

간만에 ingress 하나 생성하려는데 태클이...

 

$ kubectl describe ingress my_ingress -n my_namespace

  Type     Reason             Age    From     Message
  ----     ------             ----   ----     -------
  Warning  FailedDeployModel  3m41s  ingress  Failed deploy model due to AccessDenied: User: arn:aws:sts::110111011101:assumed-role/myEKSLoadBalancerControllerRole/1234561234561234561 is not authorized to perform: elasticloadbalancing:AddTags on ause no identity-based policy allows the elasticloadbalancing:AddTags action

 

구글에서는 위 에러 메시지와 관련된 내용은 찾기 어려웠다. AWS 문서 뒤적이며 loadBalancerController 생성하는 부분을 찾아보니, iam_policy.json 파일이 v2.3.0 에서 v.2.5.4 로 업데이트 되어 있었고, 아래 정책이 추가된 것을 확인했다.

 

        ...
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:AddTags"
            ],
            "Resource": [
                "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*",
                "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/*/*",
                "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*"
            ],
            "Condition": {
                "StringEquals": {
                    "elasticloadbalancing:CreateAction": [
                        "CreateTargetGroup",
                        "CreateLoadBalancer"
                    ]
                },
                "Null": {
                    "aws:RequestTag/elbv2.k8s.aws/cluster": "false"
                }
            }
        },
        ...

 

AWS 콘솔에서 myEKSLoadBalancerControllerRole 을 찾아 연결된 정책 AWSLoadBalancerControllerIAMPolicy 에 위 스니펫을 삽입하여 해결...

 

내용은 대충 TargetGroup / LoadBalancer 생성할 때 리소스에 태그지정하는 권한 같은데... 참 쓰잘데기 없다. 아니 매년 이렇게 미친듯이 강제로 업데이트 하는게 맞는거야? 


(참고) https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/aws-load-balancer-controller.html

 

AWS Load Balancer Controller 추가 기능 설치 - Amazon EKS

배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드 시 이전 명령에서 install을 upgrade로 변경하되, 이전 명령

docs.aws.amazon.com

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

 

 

<좌: 2022년 9월 / 우: 2024년 1월>

 

한번도 아프지 않고 잘 자라고 있는 드라세나 콤팩타.

 

완벽한 음지에서 1년 반을 있었고, 방문 사이로 들어오는 오전 햇빛 때문에 살짝 문쪽으로 아주 살짝 휘고 있다 ㅋ 크기와 음지를 감안하고, 젓가락 꼽아서 거의 말랐다 싶으면 물을 듬뿍 줬다. 대충 30일~40일 정도. 화분 길이가 길쭉해서 젓가락이 얼마 안들어가니 얼추 맞는 것 같다. 지금껏 잎 3장 정도가 끝부분이 새까맣게 탄 것들을 발견했는데, 아마도 과습일 때 그런 현상이 나타나지 않나 싶다. (사실 잘 모름.) 1년 반 동안 1도 안 큰줄 알았는데, 사진으로 이렇게 비교해보니 키가 좀 크긴 했네. 잎이 시작되는 부분을 보면 목대가 얇아진게 보이는데, 유튜브에서 보니 저 부분을 야곰야곰 뜯어주면 키가 잘 자란다고... 예전 사진이 훨씬 풍성해 보이긴 하네ㅎㅎ; 이론상으로 보면 그럴 듯 하다. 잎을 잘라내면 그만큼 영양분은 확보될 것이고, 그 영양분이 키와 잎으로 갈 수 있다는 생각이 든다. 하지만 1년 반을 키워보니, 키는 그냥 햇빛과 물이 충분하면 잘 자랄 것 같다. 잎을 잘라내는 것은 그저 디자인의 목적이 더 크지 않을까... 연꽃같은 분위기를 내느냐, 먼지털이(?) 같은 기다란 분위기를 내느냐. 나는 이제는 잎을 잘라내지 않을 예정이다. 공기정화 목적으로 들인 식물들이니 잎이 많은 것이 더 합리적. 유튜브 영상에서는 너무너무 잘 자라서 천장에 닿을 듯 하던데, 그 정도면 너무 피곤할 것 같음. 목대도 이리저리 휘어있어서 보기에도 그닥. 4계절을 잘 지냈으니 앞으로도 별 일 없을 것 같고... 넌 그저 음지에서 조금씩만 건강히 자라거라~~

 

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

1년 만에 유일하게 실패한 스투키. 8줄기 정도 있엇는데, 6개월만에 무름병 때문에 하나 보내고, 1년 정도 될 무렵 스피드하게 하나씩 맛이 갔다. 그래도 1년 동안 키워본 초식남으로 스투키만 살리지 못한 이유를 꼽아보았다.

 

 

확실히 과습에 취약하다

 

집에 18종류의 다양한 식물들이 있고, 1년 동안 물 주는 스타일은 모두가 같았다. 젓가락 꼽고 거의 말랐다 싶을 때 흠뻑줬고, 6개월 이상 스투키도 별 일이 없었던 것을 보면 그 방법이 틀리지 않았다고 생각했다. 하지만 겨울을 지내면서 무름병이 처음으로 생겼을 때, 그 때부터라도 흙 마름 체크를 더 꼼꼼히 했어야 했는데, 화분에 너무 빼곡 했던 줄기들을 때문에 대충 확인하고 물을 줬던 것 같다. 무름병이 신호를 줬을 때, 오히려 굶기듯이 키웠다면 아직 죽지는 않았을 듯. 더욱 과습이라고 느끼기 어려웠던 것은 바로 옆에 금전수도 똑같은 화분에 똑같이 빼곡하게 꼽혀 있는데, 그 아인 겁나 잘자랐음. 같은 다육이더라도 잎이 있고 없는 차이가 있긴 하지만 그 때는 '금전수도 잘 자라니, 너도 문제 없어야지.' 라는 생각이었다.

 

지금도 물 주는 스타일은 변함이 없다. 언제나 흠뻑~ 단지 식물마다 또는 계절마다 흙이 완전 말랐을 때 흠뻑 주느냐, 10% 정도 아직 젖어 있을 때 흠뻑 주느냐, 30% 정도 젖어 있을  때 흠뻑 주느냐, 그 차이.

 

그리고 예전에 스투키에서 첫 새싹을 마주했을 때 반가움 마음에 검색해보니, 본체 줄기의 영양분을 나누게 되니 뽑는 게 좋다는 글들을 보았는데 내가 볼 땐 전~혀 상관없음. 외관상 보기 싫으면 뜯으면 되고, 아니면 놔두면 됨. 만약 다음번에 스투키를 사게 된다면 저런 잎꽃이 한거 말고, 본체 튼튼한 스투키를 사보는 걸로...

 

 

... 스킨답서스에 꽃이 피었을 때, 배경으로 나왔던 가장 최근 사진.

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Apache POI 는 MS office 문서포맷을 Java 로 사용할 수 있는 API 를 제공한다.

보통 WorkBook 으로 문서를 만드는 예제나, 암호화된 문서의 암호를 삭제시킬 수 있는 예제들이 떠돌고 있다.

 

MultipartFile 로 엑셀파일 전달 받고, 해당 파일에 암호 설정해서 돌려주는 API 를 만들어 봤다.

 

 

 Gradle 

 

dependencies {
    implementation 'org.apache.poi:poi:5.2.2'
    implementation 'org.apache.poi:poi-ooxml:5.2.2'
}

 

 

 Java 

 

@PostMapping("/excel/encrypt")
public ResponseEntity<ByteArrayResource> excelEncrypt(@RequestParam MultipartFile file) {

    String[] extensionArr = {"xls", "xlsx"};  // 97~, 2007~
    String[] mimeTypeArr = {"application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"};
    // 파일검증 생략

    // apache poi 엑셀 암호화
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    try (POIFSFileSystem fs = new POIFSFileSystem()) {
        EncryptionInfo encryptionInfo = new EncryptionInfo(EncryptionMode.agile);

        Encryptor encryptor = encryptionInfo.getEncryptor();
        encryptor.confirmPassword("password!@#$");

        try (OPCPackage opc = OPCPackage.open(file.getInputStream());
             OutputStream outputStream = encryptor.getDataStream(fs)) {
            opc.save(outputStream);
        }
        fs.writeFilesystem(byteArrayOutputStream);
        byteArrayOutputStream.close();
    } catch (Exception e) {
        logger.info(e.getMessage());
    }

    HttpHeaders header = new HttpHeaders();
    String encFileName = URLEncoder.encode(file.getOriginalFilename(), StandardCharsets.UTF_8).replace("+", "%20");
    header.setContentType(MediaType.parseMediaType(file.getContentType())); // <- 지정하지 않아도 무관
    header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=utf-8''enc_" + encFileName);

    return new ResponseEntity<>(new ByteArrayResource(byteArrayOutputStream.toByteArray()),
                    header, HttpStatus.OK);
}

 

POIFS (Poor Obfuscation Implementation File System)
 - MS Office 의 OLE 2 Compound document 파일 포맷을 읽고 쓰는 컴포넌트. 
 - 모든 오피스 파일 포맷은 OLE2 방식이므로 하위 모든 컴포넌트의 기반이 된다.
HSSF (Horrible SpreadSheet Format)
 - MS excel 97 이후로 현재까지의 엑셀파일들에 읽고 쓰기를 지원하는 컴포넌트.
XSSF (XML SpreadSheet Format)
 - MS excel 2007 이후의 오픈 XML 파일 포맷인 *.xlsx 파일을 읽고 쓰는 컴포넌트.

 

 

 

 

음~ 잘된당~

용량을 10M 정도 넘겨봤더니, 에러 발생. 늘려보려 했는데... 실패!

 

Tried to allocate an array of length 132,636,469, but the maximum length for this record type is 100,000,000.
If the file is not corrupt or large, please open an issue on bugzilla to request 
increasing the maximum allowable size for this record type.
As a temporary workaround, consider setting a higher override value with IOUtils.setByteArrayMaxOverride()

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

약 1년 정도 EKS fargate + grafana 로 모니터링과 알람을 사용했다. 이왕 설치했으니까, 나름 피곤한 세팅 해가면서, 이쁘게 커스텀 잘 해왔는데, 보안 점검때마다 EKS 와 plugin 을 최신버전으로 올리는 바람에 그 때마다 Node 날아가고 전부 새로 설치+세팅 해야 한다는 점... 한번은 그냥 기분 좋게 했었는데, 두번은 못하겠다. 이게 다 fargate 를 사용해서...? AWS 의 EKS 인 만큼, AWS 안에서 모니터링과 알람을 만드는 것이 옳다고 생각하고 방법을 찾아봤다.

 

CPU / MEM / Traffic 모니터링은 기본이고, 배포시(혹은 장애시) 슬랙 알림 전송이 목표이며, 유일하게 AWS CloudWatch Container Insights 를 찾았다.

 

Container Insights 는 ECS/EKS 의 EC2/Fargate 에서 컨테이너 어플리케이션의 지표 및 로그를 수집하고 집계할 수 있다. 일반적으로 워커노드의 kubelet 이 /metrics/cadvisor 엔드포인트에서 CPU, 메모리, 디스크, 네트워크 사용량 등의 리소스 지표를 노출하는데, EKS Fargate 네트워킹 구조상 이 kubelet 에 접근이 안되기 때문에 프록시 역할을 할 ADOT(AWS Distro for OpenTelemetry 수집기를 사용하여, 워커노드의 지표 및 로그(CPU, 메모리, 트래픽) 들을 CloudWatch 로 전달한다. 그럼에도 CloudWatch 의 [향상된 관찰 기능] 은 지원되지 않는다.

 

 

 

 

ADOT Pod 생성

 

1. fargate profile 생성

 

$ kubectl create namespace fargate-container-insights
namespace/fargate-container-insights created

 

 

2. 서비스 계정 생성

 

ADOT 수집기에는 성능 로그 이벤트를 CloudWatch로 보내려면 IAM 권한이 필요하다. AWS 관리형 정책 CloudWatchAgentServerPolicy 와 연결할 역할(EKS-Fargate-ADOT-ServiceAccount-Role)을 만들고, EKS 의 서비스계정(adot-collector) 을 생성하여 연결하는 스크립트이다. YOUR-EKS-CLUSTER-NAME 과 YOUR-EKS-CLUSTER-REGION 을 적절히 수정한다.

 

$ ##!/bin/bash
CLUSTER_NAME=YOUR-EKS-CLUSTER-NAME
REGION=YOUR-EKS-CLUSTER-REGION
SERVICE_ACCOUNT_NAMESPACE=fargate-container-insights
SERVICE_ACCOUNT_NAME=adot-collector
SERVICE_ACCOUNT_IAM_ROLE=EKS-Fargate-ADOT-ServiceAccount-Role
SERVICE_ACCOUNT_IAM_POLICY=arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

$ eksctl utils associate-iam-oidc-provider \
--cluster=$CLUSTER_NAME \
--approve

$ eksctl create iamserviceaccount \
--cluster=$CLUSTER_NAME \
--region=$REGION \
--name=$SERVICE_ACCOUNT_NAME \
--namespace=$SERVICE_ACCOUNT_NAMESPACE \
--role-name=$SERVICE_ACCOUNT_IAM_ROLE \
--attach-policy-arn=$SERVICE_ACCOUNT_IAM_POLICY \
--approve

2023-11-27 22:09:08 [ℹ]  eksctl version 0.75.0
2023-11-27 22:09:08 [ℹ]  using region ap-northeast-2
2023-11-27 22:09:09 [ℹ]  1 iamserviceaccount (fargate-container-insights/adot-collector) was included (based on the include/exclude rules)
2023-11-27 22:09:09 [!]  serviceaccounts that exist in Kubernetes will be excluded, use --override-existing-serviceaccounts to override
2023-11-27 22:09:09 [ℹ]  1 task: {
    2 sequential sub-tasks: {
        create IAM role for serviceaccount "fargate-container-insights/adot-collector",
        create serviceaccount "fargate-container-insights/adot-collector",
    } }2023-11-27 22:09:09 [ℹ]  building iamserviceaccount stack "eksctl-test-addon-iamserviceaccount-fargate-container-insights-adot-collector"
2023-11-27 22:09:10 [ℹ]  deploying stack "eksctl-test-addon-iamserviceaccount-fargate-container-insights-adot-collector"
2023-11-27 22:09:10 [ℹ]  waiting for CloudFormation stack "eksctl-test-addon-iamserviceaccount-fargate-container-insights-adot-collector"
2023-11-27 22:09:26 [ℹ]  waiting for CloudFormation stack "eksctl-test-addon-iamserviceaccount-fargate-container-insights-adot-collector"
2023-11-27 22:09:43 [ℹ]  waiting for CloudFormation stack "eksctl-test-addon-iamserviceaccount-fargate-container-insights-adot-collector"
2023-11-27 22:09:43 [ℹ]  created serviceaccount "fargate-container-insights/adot-collector"

 

 

3. ADOT StatefulSet 배포

 

https://github.com/aws-observability/aws-otel-collector/blob/main/deployment-template/eks/otel-fargate-container-insights.yaml

 

파일을 다운받아, YOUR-EKS-CLUSTER-NAME 과 region=us-east-1 을 적절히 수정하여 배포한다.

 

$ kubectl apply -f eks-fargate-container-insights.yaml
clusterrole.rbac.authorization.k8s.io/adotcol-admin-role created
clusterrolebinding.rbac.authorization.k8s.io/adotcol-admin-role-binding created
configmap/adot-collector-config created
service/adot-collector-service created
statefulset.apps/adot-collector created

 

 

4. CloudWatch Log Group 확인

 

몇 분이 지나면 CloudWatch 로그 그룹에 로그가 쌓이는 것을 확인할 수 있다.
/aws/containerinsights/CLUSTER_NAME/performance

 

 

5. CloudWatch 대시보드 생성

 

Metrics > ContainerInsights 지표를 활용하여 CPU, 메모리, 트래픽 정도의 대시보드를 구현할 수 있다.
(배포 알림은 ContainerInsights 가 아닌 ALB target-group 의 HealthyHostCount 로 측정하였음. PromQL 가 없으니 잇몸으로...)

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,