linuxer-admin

gcp-terrafrom-1 with google cloud shell

gcp 스터디를 위해서 테라폼의 사용을 익히려고 한다.
그러기 위해선 먼저 테라폼을 gcp cloudshell 에서 사용하는것이 우선이라 생각했다.

테라폼으로 aws내 에선 테스트 경험이 있으므로 gcp 의 네트워크 구성과 환경에 맞춰서 테라폼을 설정하는 방법을 익혀야 했다.

gcp 에서 테라폼을 사용하려면 cloudshell 을 사용하는 방법과 인스턴스를 생성하여 사용하는 방법 아니면 클라이언트 PC에서 사용하는 방법 이렇게 3가지가 있는데 나는 cloudshell 을 매우 좋아하므로 cloudshell 로 진행 할것이다.

먼저 cloud shell 에서 테라폼을 사용하려면 몇가지 단계를 거쳐야 했다.

1 terrafrom install
2 gcp api setup
3 config setting

이 단계를 간단하게 줄여주는 페이지가 있어서 먼저 테스트 해봤다.

https://www.hashicorp.com/blog/kickstart-terraform-on-gcp-with-google-cloud-shell/  

https://github.com/terraform-google-modules/docs-examples

두개의 URL 을 참고하시기 바란다.

URL 을 따라서 진행하던중 terraform init 에서 에러가 발생하였다.

Provider "registry.terraform.io/-/google" v1.19.1 is not compatible with Terraform 0.12.18.
Provider version 2.5.0 is the earliest compatible version. Select it with
the following version constraint:

version = "~> 2.5"
Terraform checked all of the plugin versions matching the given constraint:
~> 1.19.0
Consult the documentation for this provider for more information on
compatibility between provider and Terraform versions.
Downloading plugin for provider "random" (hashicorp/random) 2.2.1…
Error: incompatible provider version

error 는 backing_file.tf 파일에서 발생하고 있었다.
간단하게 version 차이..

cloud shell 의 terrafrom version 은

dellpa34@cloudshell:~/docs-examples/oics-blog$ terraform -version
Terraform v0.12.18
provider.google v2.20.1
provider.random v2.2.1

provider.google v2.20.1 로 1.19보다 많이 높은 상태였다. 일단 진행해 보기로 했으니.. backing_file.tf 수정

provider "google" {
version = "~> 1.19.0"
region = "us-central1"
zone = "us-central1-c"
}

provider "google" {
version = "~> 2.5"
region = "us-central1"
zone = "us-central1-c"
}

수정후에 다시 terraform init 을 실행 하였다.

Initializing provider plugins…
Checking for available provider plugins…
Downloading plugin for provider "google" (hashicorp/google) 2.20.1…
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

정상적으로 실행 되는것을 확인하였다.

init 후에 apply 하니 다시 Warning 과 함께 error 가 발생하였다.

Warning: Interpolation-only expressions are deprecated
on main.tf line 9, in resource "google_compute_instance" "instance":
9: image = "${data.google_compute_image.debian_image.self_link}"
Error: Error loading zone 'us-central1-a': googleapi: Error 403: Access Not Configured. Compute Engine API has not been used in project 45002 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/compute.googleapis.com/overview?project=304102002 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry., accessNotConfigured
on main.tf line 1, in resource "google_compute_instance" "instance":
1: resource "google_compute_instance" "instance" {

이건 이전에도 겪은 케이스 같다...functions api 셋팅할때 발생한 거였는데...googleapi 관련 에러다. cloudshell 에서 컴퓨팅쪽의 api를 사용할 수 없어서 발생하는 에러로 로그에 보이는 페이지로 이동해서 그냥 허용해 준다.

Enter a value: yes
google_compute_instance.instance: Creating…
google_compute_instance.instance: Still creating… [10s elapsed]
google_compute_instance.instance: Creation complete after 10s [id=vm-instance-optimum-badger]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

허용후에 다시 terraform apply 를 치면 정상적으로 실행이 된다. 그럼 확인해 보자.

인스턴스가 생성이 됬다. 그렇다면 이젠 간단히 생성하는것 까지 완료했으므로. 이젠 기본 템플릿을 이용한 구성을 만들것이다. 생성한 테라폼은 terraform destroy 명령어로 삭제 했다.

google_compute_instance.instance: Destroying… [id=vm-instance-optimum-badger]
google_compute_instance.instance: Still destroying… [id=vm-instance-optimum-badger, 10s elapsed]
google_compute_instance.instance: Still destroying… [id=vm-instance-optimum-badger, 20s elapsed]
google_compute_instance.instance: Still destroying… [id=vm-instance-optimum-badger, 30s elapsed]
google_compute_instance.instance: Destruction complete after 38s
random_pet.suffix: Destroying… [id=optimum-badger]
random_pet.suffix: Destruction complete after 0s

정상적으로 삭제되는것을 확인할수 있었다.

gcp cloud shell 에서 terraform 을 사용하는 방법을 테스트해 보았다.
다음엔 VPC 구성과 인스턴스 그룹 생성 로드벨런서 구성까지 한방에 진행할것이다.

여담으로 cloud shell은 진짜 강력한 도구이다.

스크린샷과 같이 shell을 지원하면서 동시에 에디터도 지원한다.

vi 에 익숙한 나같은경우에는 그냥 vi 로 작업하지만 익숙하지 않은 사용자의 경우에는 우와할정도다..

쓸수록 감탄하는 cloudshell...........

GCP Professional Cloud Architect 합격 후기

AWS sap 취득 다음 순번 자격증이 GCP PCA 였다.

사실 정리를 하는 편은 아니구.. 해서 참조한 URL 을 나열 하겠다.

이수진-님의 합격후기다.

https://brunch.co.kr/@topasvga/728

서태호-님의 자격증 가이드다.

다른 사람후기는 한섭님의..첫번째 어드바이스가 있었다.

시험은 영어로 진행되서 많이 고민을 했다. 케이스를 책읽듯이 거의 외웠다.
케이스 에서 뭘 원하는지 스스로 그렸다.

이공부 덕분에 케이스 문제는 한번도 막힘없이 완벽하게 다풀었다.

그렇게 케이스 공부가 완료되고 서비스간의 연계와 사용방법을 gcp docs 를 위주로 봤다. aws sap 를 취득하면서 요령이 생긴터라 docs 를 보면서 공부하는건 어렵지 않았다.

udemy를 주로봤고 인터넷에 올라와있는 사이트들에서 문제를 많이 풀었다.

자격증 취득에 도움을 주신 서태호님,한섭님,이수진님께 감사를 드린다.

aws Route53 지역기반 라우팅

route53 지역기반 라우팅(Geolocation)을 이용하여 허용한 지역 이외에는 내 사이트를 열 수 없도록 설정하려고 한다.

근래에 내 블로그가 좀 힘찼다.

잘 관리를 안해서 힘이 없었는데 자꾸 블로그 댓글로 비아그라 광고가 들어왔다..
제길 ㅠㅠ 한30건 정도....

독일쪽 스패머인것으로 보인다.

5.189.131.199

그래서 한국/남아메리카/북아메리카를 제외한 모두를 차단하기로 하였다.

먼저 기본값으로 지역기반 라우팅으로 set ID 1로 203.0.113.1 라우팅한다.

203.0.113.1 IP는

https://tools.ietf.org/html/rfc5737

사용할수 없는 IP로 보인다. RFC5737을 참조하기 바란다. 따라서 특정하지 않는 모든 라우팅은 203.0.113.1 로 연결되도록 설정하였다.

그리고 set ID 2 / 3 /4 는 한국/남아메리카/북아메리카 로 설정하고 로드벨런서와 연결한다.

설정값은 다음과 같다.

설정된 한국/남아메리카/북아메리카 제외한 모든접속은 203.0.113.1 로 연결되어 접속할수 없게 된다.

이후 스패머가 또들어오는지 모니터링 해야겠다.

아! 남아메리카/북아메리카 를 열어 준 이유는 google robots 가 크롤링을 할 수 있도록 허용해줬다. 그래도 구글에서 검색은 되야 하므로....

이상이다. 좋은하루 되시길.!

GCP cloud CDN-cloud storage - GCP-LB

cloud storage 를 생성했다. cloudshell 로 생성하여

gsutil mb gs://linuxer-upload

명령어 한줄로 일단 생성은 잘됬다.

그래서 GUI로 생성해봤다.

멀티리전은 전 세계일거라 막연히 생각했는데 미국/유럽/아시아다.

..?너무 스토리지 분할이 애매한거 같은데..이럼 스텐다드만 써야 하는거 아닌가..

객체별 제어도 가능하다. 생성을 누르니까 버킷이름을 DNS로 생성해서 도메인의 소유권을 인증해야 했다. DNS 레코드를 통해 도메인 소유권 인증 을 진행해야 한다.

https://search.google.com/search-console/welcome

사이트로 이동해서

도메인을 입력하고

txt 레코드를 입력했다.

-> set q=txt
-> gs.linuxer.name
서버: [116.125.124.254]
Address: 116.125.124.254
권한 없는 응답:
gs.linuxer.name text = "google-site-verification=x1bcH219nXSYlS22cVVN7QNhROkqHWxjGmMtTKOxFCk"

그리고 nslookup 으로 조회 정상적으로 조회가 잘된다.

이상하게 구글에선 확인이 늦다. 왜지? 걸어야 하는딩;;

txt 레코드..설정도 이상한게 없다. 아............급 막혔다. 그래서 루트도메인에 걸려있던 spf 레코드를 지우고 설정해봤는데..

한번 실패하더니 소유권 확인이 가능했다.

소유자가 확인이 되는데 아직도 버킷은 생성이 안된다.....왜죠??gcp 님? 그래서 브라우저를 종료하고 다시 생성했더니 정상적으로 됬다..

이제 생성한 도메인을 백엔드로 두고 CDN을 연결할 것이다.

네트워크 서비스 > Cloud CDN 서비스가 있다.

CDN 을 생성하기 위해선 로드벨런서가 필요하다.

먼저 로드벨런서를 생성하자.

백엔드를 생성하고~백엔드를 생성하면 자동으로 라우팅 규칙도 생성된다.

인증서도 생성해 준다.

SSL 인증서 'linuxer-cert'을(를) 만들지 못했습니다. 오류: Invalid value for field 'resource.managed.domains[0]': '*.linuxer.name'. Wildcard domains not supported.

에러가 발생한다 acm 을 염두에 두고 와일드카드로 생성했는데 와일드 카드는 안된단다.. 이런..그래서 gs.linuxer.name 으로 생성했다.

LB 생성하면서 CDN 을 켜는 속성이 존재해서 켜줬다.

Google 관리형 SSL 인증서는 인증서당 도메인 이름 1개만 지원하며 와일드 카드 일반 이름이나 주체 대체 이름 여러 개를 지원하지 않습니다.
https://cloud.google.com/load-balancing/docs/ssl-certificates

인증서 프로비저닝이 실패했다. 그래서 얼른 프로토콜을 HTTP로 돌리고 테스트했는데 새로운걸 알았다.

프런트엔드의 IP가 다르다. 헐..? 이러면 애니캐스트고 뭐고 소용없는거 아냐? 그래서 하나더 만들어 봤다.

음.. 뭐지.. 이해할수가 없는 하나의 백엔드에 여러개의 프런트엔드를 붙인건데 IP가 다르다...이거 어떻게 이해해야하지..? 생각해보니 임시IP로 생성해서 그런것 같다.

일단 CDN 붙이고

아 익명...

allusers 가 view 권한을 가지게 된 이후로 정상적으로 보인다.

조금 애매한부분은 세밀한 권한 관리가 되지 않는 점이 좀 애매하달까..

GCP Cloud Functions

12월 29일 미션으로 Cloud Functions 이 포함되어있다.

미션은 이미지 업로드 후 리사이즈.

먼저 cloud functions 이 뭔지부터 알아야 한다. aws 에서 말하는 서버리스 컴퓨팅 서비스이다. 일반적으로 코어나 메모리를 정적으로 할당받아서 사용하는 방식이 아닌것이다.

먼저 Cloud Functions을 사용하기 위해서 진행해야 할 작업이 있다.

gcp의 큰장점을 cloudshell 을 지원한다는 것이다. 인스턴스쉘 이긴 하나 언제 어디서나 shell을 사용할수 있다.

먼저 cloudshell을 실행하면 이런 창이뜬다.

여기에 Cloud Functions 을 사용하기 위한 환경을 우선적으로 구성해야 한다.

먼저 cloudshell 은 굉장히 퓨어한 상태로 프로젝트부터 설정해줘야한다.

hoceneco@cloudshell:~$ gcloud config set project sage-facet-22972
Updated property [core/project].
hoceneco@cloudshell:~ (sage-facet-22972)

gcloud config set project 명령어로 지정하고

hoceneco@cloudshell:~ (sage-facet-22972)$ gcloud config list
[component_manager]
disable_update_check = True
[compute]
gce_metadata_read_timeout_sec = 5
[core]
account =
disable_usage_reporting = False
project = sage-facet-22972
[metrics]
environment = devshell

gcloud config list 명령어로 지정된 리스트를 확인할 수 있다.

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 이렇게 다.

hoceneco@cloudshell:~ (sage-facet-22972)$ gsutil mb gs://linuxer-upload
Creating gs://linuxer-upload/…
hoceneco@cloudshell:~ (sage-facet-22972)$ gsutil mb gs://linuxer-convert
Creating gs://linuxer-convert/…

linuxer-upload, linuxer-convert 버킷을 생성하고, 이름에 따라 업로드 와 리사이즈된 이미지를 넣을 버킷이다.

hoceneco@cloudshell:~ (sage-facet-229723)$ git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Cloning into 'nodejs-docs-samples'…
remote: Enumerating objects: 17312, done.
remote: Total 17312 (delta 0), reused 0 (delta 0), pack-reused 17312
Receiving objects: 100% (17312/17312), 15.29 MiB | 7.22 MiB/s, done.
Resolving deltas: 100% (11332/11332), done.
hoceneco@cloudshell:~ (sage-facet-229723)$ cd nodejs-docs-samples/functions/imagemagick

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
명령어를 이용하여 test code를 다운받고 다운받은 디렉토리로 이동한다.
일단 먼저 테스트하는것은 아래 Docs 를 참고하여 진행하였다.

https://cloud.google.com/functions/docs/tutorials/imagemagick?hl=ko

"버킷에 업로드되는 이미지 중 불쾌감을 주는 이미지를 감지하고 이를 흐리게 처리하는 방법을 설명합니다." 라고 한다.

hoceneco@cloudshell:~/nodejs-docs-samples/functions/imagemagick (sage-facet-22972)$ gcloud functions deploy blurOffensiveImages --trigger-bucket=gs://linuxer-upload --set-env-vars BLURRED_BUCKET_NAME=gs://linuxer-convert --runtime=nodejs8
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-229723@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/gcf-upload-us-central1-ede08b3c-b370-408b-ba59-95f296f42e3e/40187a52-802f-4924-98d1-8802e41b24da.zip?GoogleAccessId=service-300346160521@gcf-admin-robot.iam.gserviceaccount.com&Expires=1577509811&Signature=gUhzdRazlnkRrUgPmv2P3tjdw%2BtXTDZq1FDZtzchPBJjkn5trLN6c27mawLRneazA5%2FLFZuUCmBLXIb9%2B5Iaq2M6cM0c9kzCpKGrk41W%2Boh3ST4ybWHsxd1YZi9G4J0uCKCSs1aLw4WPcQ7nCRJhDv5pqBbXXIJUvFTkQqUzH98TnEx2o2u9aJd44iyrpWwEiirxG%2BxHk1sVBBKpdUAbJb%2FYOT0lzH6%2F7y%2FOP51A0kEcRtAbmPYHSt87%2FGZOrNn2qHdQWap4MiT%2BYd4eVLOLTkd%2Fmvv8%2FcjWS4cousamOq8FSvvDC%2BQmvf01AGOgt%2BBrHyDkmAlrLvzemw6989BFlA%3D%3D
status: ACTIVE
timeout: 60s
updateTime: '2019-12-28T04:40:54Z'
versionId: '1'

gcloud functions deploy 명령어로 functions 을 생성하면 된다. runtime 설정이 각각 사용하는 언어마다 다르므로 버전을 잘확인해보자.

생성이끝나면 명령어로 이미지를 업로드해본다.

hoceneco@cloudshell:~/nodejs-docs-samples/functions/imagemagick (sage-facet-22972)$ gsutil cp zombie-949916_1280.jpg gs://linuxer-upload
Copying file://zombie-949916_1280.jpg [Content-Type=image/jpeg]…
[1 files][355.3 KiB/355.3 KiB]
Operation completed over 1 objects/355.3 KiB.

이미지 업로드가 끝나면 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'

https://console.developers.google.com/apis/api/vision.googleapis.com/overview?project=

링크를 눌러서 이동해서 사용하기 누르면 오래걸리지 않아 api 를 사용할수 있다.
그리고 이미지를 재업로드 하고 로그를 확인하면 다음과 같다.

hoceneco@cloudshell:~/nodejs-docs-samples/functions/imagemagick (sage-facet-229723)$ gcloud functions logs read --limit 100

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 부분만 수정하면 될거 같았다.

https://aheckmann.github.io/gm/docs.html

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로 작아졌다. 물론이미지 사이즈도..

lamdba에 비해 사용이 너무편해서 깜짝놀랐다.

기능과 범위에 대해 알수있는 미션이었다. 유익함 별 다섯개.