명령어로 UUID 생성해서 넣어줄수 있다. UUID 가 보인다면 new / org 변수에 UUID 를 export 해주자 UUID 는 사람마다 다들테니 각각 잘확인해서 복붙하자.
# export new=’3a26abfe-67eb-49e4-922a-73f6cd132402’ # export org=’781f875d-4262-4f01-ba72-d6bd123785f5’ # sed -i -e "s/$org/$new/g" etc/fstab # sed -i -e "s/$org/$new/g" boot/grub2/grub.cfg # mount -B /dev dev # mount -B /proc /proc # mount -B /sys sys # chroot .
위 명령어를 치면 /mnt/new 경로에서 지정한 UUID 로 fstab 안의 UUID를 변경하고 grub.cfg 안의 UUID 또한 자동으로 치환해줄거다. 그런다음 3개의 경로를 bind mount 하고 현재위치에서 chroot . 를 치면 chroot 가 현재위치로 변경된다.
[root@ip-172-31-12-119 mnt]# dd bs=16M if=/dev/xvdg1 of=/dev/xvdf1 count=113 113+0 records in 113+0 records out 1895825408 bytes (1.9 GB) copied, 29.3328 s, 64.6 MB/s [root@ip-172-31-12-119 mnt]# resize2fs -p /dev/xvdf1 resize2fs 1.43.5 (04-Aug-2017) Resizing the filesystem on /dev/xvdf1 to 1310464 (4k) blocks. The filesystem on /dev/xvdf1 is now 1310464 (4k) blocks long.
[root@ip-172-31-12-119 mnt]# resize2fs -p /dev/xvdf1 resize2fs 1.43.5 (04-Aug-2017) Resizing the filesystem on /dev/xvdf1 to 1310464 (4k) blocks. The filesystem on /dev/xvdf1 is now 1310464 (4k) blocks long.
#cd /mnt/new # mount -B /dev dev # mount -B /proc /proc # mount -B /sys sys # chroot .
제일 중요한 부분은 /proc 부분이다. mount bind 해주지 않으면 정상적으로 파티션 포지션을 불러오지 않는다.
chroot 까지 정상적으로 마쳐 지면 이제 거의 다왔다. 그냥은 안되고 몇가지를 수정해줘야 한다. 근래에 사용하는 aws 의 HOST가 변경되어서 볼륨 포지션이 좀 변경되었기 때문이다. amazon linux 1 에서는 /boot/grub/device.map의 수정이 필요하다. 하이퍼 바이저가 디바이스를 호출하는 이름이 변경된것이므로 수정하지 않으면 grub-install 이 불가능하다.
# grub-install /dev/xvdf Installation finished. No error reported. This is the contents of the device map /boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (hd0) /dev/xvda (hd1) /dev/xvdf (hd2) /dev/xvdg
amazon linux 1 의 경우엔 파티션이 xvda 로 보여서 xvda 의 첫번째 파티션은 1번을 확장한다.
amazon linux 2 의 경우엔 파티션이 nvme1n1p1 으로 보이므로 실제 명령어는
# growpart /dev/nvme1n1 1
로 명령어를 쳐야 한다. growpart 로 파티션을 확장하면 Disk label type: dos -> Disk label type: gpt 변경되고,
위처럼 디스크 라벨 부터 파티션 타입까지 변경된다.
fdisk -l 명령어로 확인하며 진행하자.
이제 다음은 파일시스템의 확장이 필요하다. 파일시스템 확장은 resize2fs 명령어로 확장한다.
# resize2fs /dev/xvda1 resize2fs 1.43.5 (04-Aug-2017) Filesystem at /dev/xvda1 is mounted on /; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 2 The filesystem on /dev/xvda1 is now 5242363 (4k) blocks long.
hoceneco@cloudshell:~ (sage-facet-22972)$ sudo gcloud components update Your current Cloud SDK version is: 274.0.0 You will be upgraded to version: 274.0.1 ┌──────────────────────────────────────────────────┐ │ These components will be updated. │ ├──────────────────────────┬────────────┬──────────┤ │ Name │ Version │ Size │ ├──────────────────────────┼────────────┼──────────┤ │ Cloud SDK Core Libraries │ 2019.12.27 │ 12.7 MiB │ └──────────────────────────┴────────────┴──────────┘
gcloud 구성요소를 업데이트한다 - 꼭할필요는 없다.
오늘 미션에서 필요한 준비물은 Cloud Functions, Google Cloud Vision API, ImageMagick, Cloud Storage 이렇게 다.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git 명령어를 이용하여 test code를 다운받고 다운받은 디렉토리로 이동한다. 일단 먼저 테스트하는것은 아래 Docs 를 참고하여 진행하였다.
이미지 업로드가 끝나면 functionc로그를 확인하면 정상작동됬는지 확인할수 있다. 첫번째 업로드에선 api 에러가 발생했는데. 이때 콘솔에서 api 를 사용할수 있도록 설정해줬다.
E blurOffensiveImages 909862418886020 2019-12-28 03:42:15.967 Error: 7 PERMISSION_DENIED: Cloud Vision API has not been used in project 300346160521 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/vision.googleapis.com/overview?project= then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. at Object.callErrorFromStatus (/srv/node_modules/@grpc/grpc-js/build/src/call.js:30:26) at Http2CallStream.call.on (/srv/node_modules/@grpc/grpc-js/build/src/client.js:96:33) at emitOne (events.js:121:20) at Http2CallStream.emit (events.js:211:7) at process.nextTick (/srv/node_modules/@grpc/grpc-js/build/src/call-stream.js:97:22) at _combinedTickCallback (internal/process/next_tick.js:132:7) at process._tickDomainCallback (internal/process/next_tick.js:219:9) D blurOffensiveImages 909862418886020 2019-12-28 03:42:16.027 Function execution took 570 ms, finished with status: 'error'
D blurOffensiveImages 909862418886020 2019-12-28 03:42:16.027 Function execution took 570 ms, finished with status: 'error' D blurOffensiveImages 909865384788642 2019-12-28 03:47:22.883 Function execution started I blurOffensiveImages 909865384788642 2019-12-28 03:47:28.294 Analyzing zombie-949916_1280.jpg. I blurOffensiveImages 909865384788642 2019-12-28 03:47:29.696 Detected zombie-949916_1280.jpg as inappropriate. I blurOffensiveImages 909865384788642 2019-12-28 03:47:30.683 Downloaded zombie-949916_1280.jpg to /tmp/zombie-949916_1280.jpg. I blurOffensiveImages 909865384788642 2019-12-28 03:47:40.091 Blurred image: zombie-949916_1280.jpg I blurOffensiveImages 909865384788642 2019-12-28 03:47:40.414 Uploaded blurred image to: gs://gs://linuxer-convert/zombie-949916_1280.jpg D blurOffensiveImages 909865384788642 2019-12-28 03:47:40.419 Function execution took 17551 ms, finished with status: 'ok' D blurOffensiveImages 909860416701916 2019-12-28 03:51:04.290 Function execution started I blurOffensiveImages 909860416701916 2019-12-28 03:51:04.295 Analyzing zombie-949916_1280.jpg. I blurOffensiveImages 909860416701916 2019-12-28 03:51:05.663 Detected zombie-949916_1280.jpg as inappropriate. I blurOffensiveImages 909860416701916 2019-12-28 03:51:06.283 Downloaded zombie-949916_1280.jpg to /tmp/zombie-949916_1280.jpg.
정상적으로 컨버팅이 된거다.
원본
블러처리된것.
자동으로 블러 처리가 완료된것을 확인할수 있다.
오늘의 미션은 resize이므로 resize를 하기위해선 index.js를 수정해야한다. 오늘의 실습에선 GraphicsMagick for node.js 을 이용해서 테스트를 진행했으므로 아주 수월했다. 원래사용한 blur 부분만 수정하면 될거 같았다.
blur Accepts a radius and optional sigma (standard deviation). gm("img.png").blur(radius [, sigma])
옵션은 위와 같고
resize Resize the image. options %, @, !, < or > see the GraphicsMagick docs for details gm("img.png").resize(width [, height [, options]]) To resize an image to a width of 40px while maintaining aspect ratio: gm("img.png").resize(40) To resize an image to a height of 50px while maintaining aspect ratio: gm("img.png").resize(null, 50) To resize an image to a fit a 40x50 rectangle while maintaining aspect ratio: gm("img.png").resize(40, 50) To override the image's proportions and force a resize to 40x50: gm("img.png").resize(40, 50, "!")
그러니까
이부분을 .blur(0, 16) 부분을 resize 옵션으로 변경만 하면되는것이다.
.resize(200, 200) 으로 수정을 하였다. 그리고 functions deploy 하고
gcloud functions deploy blurOffensiveImages --runtime nodejs8 --trigger-bucket=gs://linuxer-upload --set-env-vars BLURRED_BUCKET_NAME=gs://linuxer-convert Deploying function (may take a while - up to 2 minutes)…done. availableMemoryMb: 256 entryPoint: blurOffensiveImages environmentVariables: BLURRED_BUCKET_NAME: gs://linuxer-convert eventTrigger: eventType: google.storage.object.finalize failurePolicy: {} resource: projects/_/buckets/linuxer-upload service: storage.googleapis.com labels: deployment-tool: cli-gcloud name: projects/sage-facet-22972/locations/us-central1/functions/blurOffensiveImages runtime: nodejs8 serviceAccountEmail: sage-facet-22972@appspot.gserviceaccount.com sourceUploadUrl: https://storage.googleapis.com/gcf-upload-us-central1-ede08b3c-b370-408b-ba59-95f296f2e3e/4a80effd-0371-4317-8651-0416cffc0563.zip?GoogleAccessId=service-300346160521@gcf-admin-robot.iam.gserviceaccount.com&Expires=1577519172&Signature=CrNrgjDfo8gsr%2FoeGkcEiRvnMskkK5J4JHRoDMyh9DpXnXmp4ivWOlRsQ136GL9iK4FBvsxmAtIby4WgTECry4dYU%2FN6UkfjZSBLVtzJnJxR%2F5h7ZLY9PMd%2BDYcV1AAVbw9i1paFgBNjAq1WhNiMmmXonFBpyRHBlqMLn4CKuW7QAmA7NXOugTpQY3b%2BQ9E1ia9uIZtNwqcKfv1C1GM8e2%2FdKhMwwlUPU2EYy9gb4nirHvsdrYbzdewabmPwlRtgq1b2wTjWiuMM53vO9fDy6skNaB58tqumSfUeHM%2FTrjQrlqGejjon2cx9IlH9xF5kGKfLGzBesXEHj%2B6K6ZqilA%3D%3D status: ACTIVE timeout: 60s updateTime: '2019-12-28T07:17:00Z' versionId: '5'
정상적으로 생성이 되면 업로드를 진행하였다.
D blurOffensiveImages 909966712855810 2019-12-28 07:17:16.904 Function execution started I blurOffensiveImages 909966712855810 2019-12-28 07:17:17.003 Analyzing zombie-949916_1280.jpg.
functions 이 정상적으로 실행이 완료되고
이미지가 리사이즈 되는것을 확인할수 있었다. 355.3KB -> 12.69KB로 작아졌다. 물론이미지 사이즈도..