lambda에 S3를 연동시켜 두고, 해당 S3에 이벤트가 있을 때마다 람다를 실행시키는 코드를 해석해본다.
코드
const aws = require('aws-sdk'); const fs = require('fs'); var s3 = new aws.S3({ apiVersion: '2006-03-01' });
exports.handler = async(event, context, callback) => { const bucket = event.Records[0].s3.bucket.name; console.log(event); //실행결과 테스트 1번 console.log(event.Records); //실행결과 테스트 2번 console.log(event.Records[0]); //실행결과 테스트 3번 console.log(bucket); //그럼 이건 .s3.bucket.name인 jane-bkt만 출력됨. const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));// 여기부턴 실행결과 2로 이동 const params = { Bucket: bucket, Key: key, }; var theObject = await s3.getObject(params).promise(); const data = JSON.parse(theObject.Body); console.log(data); // console.log(theObject.Body.toString('utf8')); // 위와 결과값이 같지만, 보기 좋은 형태로 try { const { ContentType } = await s3.getObject(params).promise(); console.log('CONTENT TYPE:', ContentType); console.log('********** Event generated by S3 ************* '); return ContentType;
} catch (err) { console.log(err); const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`; console.log(message); throw new Error(message); } };
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); // 여기부턴 실행결과 2로 이동 console.log(event.Records[0].s3.object.key.replace(/\+/g.'')); // object.key에 +제거(/+) 및 전역으로 확장(/g)
const params = { Bucket: bucket, Key: key, }; var theObject = await s3.getObject(params).promise(); console.log(theObject); // 결과 1) const data = JSON.parse(theObject.Body); console.log(data); // console.log(theObject.Body.toString('utf8')); // 위와 결과값이 같지만 보기 좋은 형태로 try { const { ContentType } = await s3.getObject(params).promise(); console.log('CONTENT TYPE:', ContentType); console.log('********** Event generated by S3 ************* '); return ContentType;
} catch (err) { console.log(err); const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`; console.log(message); throw new Error(message); } };
실행결과 2
1) console.log(theObject); // 결과 1)
Function Logs START RequestId: ed9a9525-9994-48da-8834-16ec0ab5c2d6 Version: $LATEST 2022-05-22T02:41:07.808Z ed9a9525-9994-48da-8834-16ec0ab5c2d6 INFO { AcceptRanges: 'bytes', LastModified: 2022-05-20T02:49:10.000Z, ContentLength: 80, ETag: '"5704c18c8279716da4b82c028dddb5d4"', ContentType: 'application/json', Metadata: {}, Body: <Buffer 7b 0a 20 20 22 6e 61 6d 65 22 3a 20 22 4a 61 6e 65 22 2c 0a 20 20 22 61 67 65 22 3a 20 22 32 38 22 2c 0a 20 20 22 63 6f 6d 70 61 6e 79 22 3a 20 22 53 ... 30 more bytes> // 이 body를 아래 코드에서 JSON으로 파싱 후 출력함. const data = JSON.parse(theObject.Body); }
} catch (err) { console.log(err); const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`; console.log(message); throw new Error(message); // 에러 던지기. } };
// json 파일을 읽어와서 json 형태로 출력 var theObject = await s3.getObject(params).promise(); const data = JSON.parse(theObject.Body); console.log(data); // console.log(theObject.Body.toString('utf8')); // 보기 예쁜 형태로
// S3에서 이벤트가 발생할 때마다 로그에 찍어줄 값.
try { const { ContentType } = await s3.getObject(params).promise(); console.log('CONTENT TYPE:', ContentType); console.log('********** Event generated by S3 ************* '); return ContentType; } catch (err) { console.log(err); const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`; console.log(message); throw new Error(message); } };
3. 람다의 테스트에서 awsRegion, bucket-name, arn, key를 바꾸어주어야 정상 테스팅됨.
"awsRegion": “ap-northeast-2",
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "testConfigRule",
"bucket": {
"name": "jane-bkt”,
"ownerIdentity": {
"principalId": "EXAMPLE"
},
"arn": "arn:aws:s3:::jane-bkt"
},
"object": {
"key": "s3test.json",
"size": 1024,
"eTag": "0123456789abcdef0123456789abcdef",
"sequencer": "0A1B2C3D4E5F678901"
}
4. 테스팅 결과
1) json 파일이 예쁘게 나온다.
2) S3의 해당 버킷에 새로운 파일을 업로드할 경우, 람다가 실행되어 Cloudwatch에서 로그를 확인할 수도 있다.
jane:~$ ipmitool user list 1 Could not open device at /dev/ipmi0 or /dev/ipmi/0 or /dev/ipmidev/0: No such file or directory jane:~$ // 이 작업은 root 계정에서 진행해야 한다. jane:~$ su - Password: jane:~# jane:~# ipmitool user list 1 ID Name Callin Link Auth IPMI Msg Channel Priv Limit 1 true false false NO ACCESS 2 root true true true ADMINISTRATOR 3 true false false NO ACCESS 4 true false false NO ACCESS 5 true false false NO ACCESS 6 true false false NO ACCESS 7 true false false NO ACCESS 8 true false false NO ACCESS 9 true false false NO ACCESS 10 true false false NO ACCESS 11 true false false NO ACCESS 12 true false false NO ACCESS 13 true false false NO ACCESS 14 true false false NO ACCESS 15 true false false NO ACCESS 16 true false false NO ACCESS jane:~# jane:~# ipmitool user set password 2 password_test // ID=2의 password를 password_test로 바꾼다.
2. 이미지 저장(다운받은 image를 tar파일로 추출): docker save # docker save -o [파일명].tar [image id] // image id는 docker image list로 조회 (ex. 7cc97b58fb0e)
controller-0:~# docker image list | grep v2.22.1 harbor.jane.net/dependency/quay.io/prometheus/prometheus v2.22.1 7cc97b58fb0e 17 months ago 168MB
3. 이미지 넣기: docker load # docker load -i [파일명.tar]
4. 넣은 image를 내부 registry로 변경(기존 prometheus의 cr에 image주소가 내부 registry라서 진행): docker tag # docker tag harbor.jane.net/dependency/quay.io/prometheus/prometheus:v2.22.1 registry.infra.jane.cluster.local:19092/quay.io/prometheus/prometheus:v2.22.1
5. tag가 변경된 image를 서버로 넣기: docker push # docker push registry.infra.jane.cluster.local:19092/quay.io/prometheus/prometheus:v2.28.1 The push refers to repository [registry.infra.jane.cluster.local:19092/dependency/kube-state-metrics/kube-state-metrics] a7b3323785fe: Pushed 07363fa84210: Pushed v2.2.0: digest: sha256:8008b06ed82e8517add62ae9a7893518244890de6efa6517adf45a6dd54eae2d size: 739
그래서, scheduler를 describe하여 조회한 결과, 'failed to start container "kube-scheduler": Error response from daemon: OCI runtime create failed: container_linux.go:345: starting containre process caused "Exec: \"kube-schedulerrrr\": executable file not found in $PATH: unknown" error가 존재하였음.