Edge Functions의 작동 방식
IBM Cloud® Internet Services Edge functions를 사용하면 인프라를 구성하거나 유지보수하지 않고도 서버리스 실행 환경을 사용하여 기존 애플리케이션을 작성하거나 수정할 수 있습니다. Edge 기능을 정의하고 클라우드 에지에 업로드하여 요청이 오리진에 도달하기 전에 요청을 처리할 수 있습니다. CIS Edge 기능은 HTTP 요청 및 응답을 수정하거나 병렬 요청을 작성하거나 클라우드 에지에서 응답을 생성하는 데 사용할 수 있습니다.
Edge Functions는 정의된 도메인을 기반으로 URI와 조치를 연관시킵니다. 이 연관을 _트리거_라고 합니다. 사이트에 대한 수신 요청이 클라우드 에지에서 인터셉트되어 계정 또는 도메인의 트리거와 일치하는지 비교됩니다. 요청 URL이 트리거 URI와 일치할 경우 트리거와 연관된 조치가 실행됩니다.
엣지 기능은 최신 웹 브라우저에서 사용할 수 있는 서비스 작업자 API를 기반으로 모델링되며, 가능한 한 동일한 API를 사용합니다.
서비스 작업자 API를 사용하면 사이트에 대해 작성되는 모든 요청을 인터셉트할 수 있습니다. JavaScript가 요청을 처리하고 나면 사용자 사이트나 다른 사이트에 대해 원하는 수의 하위 요청을 작성하고 최종적으로 방문자에게 응답을 리턴하도록 선택할 수 있습니다.
표준 서비스 작업자와 달리 Edge Functions는 사용자의 브라우저가 아닌 CIS 에지 서버에서 실행됩니다. 즉, 악의적인 클라이언트가 우회할 수 없는 신뢰할 수 있는 환경에서 코드가 실행된다는 것을 신뢰할 수 있습니다. 또한 사용자는 서비스 작업자를 지원하는 최신 브라우저를 사용하지 않아도 됩니다. 브라우저가 아닌 API 클라이언트에서 요청을 인터셉트할 수도 있습니다.
내부적으로 Edge Functions는 Chrome 브라우저에 사용되는 것과 동일한 V8 JavaScript 엔진을 사용하여 인프라에서 작업자를 실행합니다. V8은 동적으로 JavaScript 코드를 매우 빠른 기계 코드로 컴파일하므로 성능이 향상됩니다. 따라서 코드가 마이크로초 단위로 실행되고 에지 서버가 초당 수천 개의 스크립트를 실행할 수 있습니다.
Edge 기능은 V8을 사용하지만 Node.js는 사용하지 않습니다. 작업자 내부에서 사용할 수 있는 JavaScript API는 당사에서 직접 구현합니다. 직접 V8로 작업을 수행하면 고객과 인프라를 안전하게 유지하는 데 필요한 보안 제어를 사용하여 효율적으로 코드를 실행할 수 있습니다.
Edge Functions 요청 특성에 대한 작업
여기서는 CIS Edge Functions용 Cloudflare 런타임 API에 대해 설명합니다. Edge Functions 런타임은 클라우드 에지에서 실행되는 스크립트에서 사용할 수 있는 다음과 같은 Cloudflare API를 제공합니다.
생성자 구문
new Request(input [, init])
생성자 매개변수
-
input
: URL이 포함된 USVString 또는 기존Request
오브젝트일 수 있습니다.url
은 불변 특성이므로, 요청을 수정하거나 URL을 변경할 경우에는 이 매개변수의 새 URL을 전달해야 합니다. -
init
(선택사항): 요청에 적용할 사용자 정의 설정이 포함된 선택적 오브젝트입니다. 유효한 옵션은 다음과 같습니다.method
: 요청 메소드입니다(예:GET
또는POST
).headers
:Headers
오브젝트입니다.-
body
: 요청에 추가할 텍스트입니다.GET
또는HEAD
메서드를 사용하는 요청에는 본문을 포함할 수 없습니다. -
redirect
: 요청이 페치될 때 적용되는 모드입니다. 이벤트 핸들러의 수신fetchEvent
에서 생성되는 요청의 기본값은manual
입니다. 새로 생성되는 요청(new Request (url)
)의 기본값은follow
입니다. 올바른 옵션은 다음과 같습니다.follow
: 경로 재지정 응답이 페치로 리턴되면 경로 재지정되지 않은 코드가 리턴될 때까지 응답의Location
헤더를 기준으로 다른 페치가 실행됩니다. 예를 들어await fetch(..)
는301
경로 재지정을 리턴하지 않습니다.manual
: 경로 재지정 응답이 페치에서 리턴됩니다.
-
특성
수신 Request
오브젝트(event.request
)의 모든 특성은 읽기 전용입니다. 요청을 수정하려면 Request
오브젝트를 작성한 후 수정 옵션을 생성자에게 전달해야 합니다.
body
: 컨텐츠의ReadableStream
을 노출하는 단순 Getter입니다.bodyUsed
: 본문이 응답에 사용되었는지 여부를 선언하는 부울입니다.cf
: Cloudflare 파트너가 제공한 데이터가 포함된 오브젝트입니다.headers
: 요청에 대한 연관된Headers
오브젝트를 포함합니다.method
: 요청과 연관된 요청 메소드입니다(예:GET
또는POST
).redirect
: 사용할 경로 재지정 모드입니다(follow
또는manual
).url
: 요청 URL을 포함합니다.
cf
오브젝트
표준 Request
오브젝트에 대한 특성 이외에도, request.cf
오브젝트를 사용하여 기능이 적용되는 방법과 Cloudflare에서 제공하는 기타 사용자 정의 정보를 제어할 수 있습니다. 예를 들면 다음과 같습니다.
if (request.cf.asn == 64512) {
return new Response('Block the ASN 64512 response')
}
를 사용하여 https://cloudflareworkers.com 를 사용하여 스크립트를 작성하고 테스트하는 경우 request.cf
콘텐츠는 미리보기 모드에서 사용할 수 없습니다. 해당 컨텐츠를 실행하려면 프로덕션 상태여야 합니다.
다음 특성에는 앱 로직에 도움이 되는 수신 요청의 특수 정보가 포함되어 있습니다. 모든 플랜이 다음 특성에 액세스할 수 있습니다.
asn
: 수신 요청의 ASN입니다(예:395747
).colo
: 요청이 발생한 데이터 센터의 3자 공항 코드입니다(예:"DFW"
).weight:
: HTTP/2 우선순위 지정을 위한 브라우저 요청 가중치입니다.exclusive:
: 브라우저에서 요청한 HTTP/2 독점 플래그입니다(Chromium 기반 브라우저의 경우 1, 다른 브라우저의 경우 0).group:
: 요청 그룹에 대한 HTTP/2 스트림 ID입니다(Firefox의 경우에만 0이 아님).group-weight
: 요청 그룹에 대한 HTTP/2 가중치입니다(Firefox의 경우에만 0이 아님).tlsCipher
: CIS에 연결하기 위한 암호입니다(예:"AEAD-AES128-GCM-SHA256"
).country
: 수신 요청의 2자 국가 코드입니다.CF-IPCountry
헤더에도 동일한 값이 제공됩니다(예:"US"
).tlsClientAuth
: mTLS에 대해 사용으로 설정된 경우에만 설정합니다. 오브젝트는 다음 특성을 가질 수 있습니다.certIssuerDNLegacy
,certIssuerDN
,certIssuerDNRFC2253
,certSubjectDNLegacy
,certVerified
,certNotAfter
,certSubjectDN
,certFingerprintSHA1
,certNotBefore
,certSerial
,certPresented
,certSubjectDNRFC2253
tlsVersion
: CIS에 연결하기 위한 TLS 버전입니다(예:TLSv1.3
).
Standard 및 Enterprise 플랜은 다음 특성에 액세스할 수 있습니다.
requestPriority
: 요청 오브젝트의 브라우저 요청 우선순위 지정 정보입니다(“weight=192;exclusive=0;group=3;group-weight=127”
).city
: 수신 요청의 도시입니다(예:"Austin"
).continent
: 수신 요청의 대륙입니다(예:"NA"
).httpProtocol
: HTTP 프로토콜입니다(예:"HTTP/2"
).latitude
: 수신 요청의 위도입니다(예:"30.27130"
).longitude
: 수신 요청의 경도입니다(예:"-97.74260"
).postalCode
: 수신 요청의 우편번호입니다(예:"78701"
).region
: 알고 있는 경우, 수신 요청의 IP 주소와 관련된 첫 번째 레벨 지역의 ISO 3166-2 이름입니다. 알려지지 않은 경우 빈 문자열입니다(예:"Texas"
).regionCode
: 알고 있는 경우, 수신 요청의 IP 주소와 관련된 첫 번째 레벨 지역에 대한 ISO 3166-2 코드입니다. 알려지지 않은 경우 빈 문자열입니다(예:"TX"
).timezone
: 수신 요청의 시간대입니다(예:"America/Chicago"
).
모든 플랜은 아웃바운드 요청에 다음 기능을 설정할 수 있습니다.
-
cacheEverything
: 이 옵션은 응답에 표시되는 헤더에 관계없이 CIS가 이 요청에 대한 응답을 강제로 캐싱하도록 설정합니다. 이는 "캐시 레벨" 페이지 규칙을 "모두 캐시"로 설정하는 것과 같습니다(예:true
). -
scrapeShield
: ScrapeShield를 토글합니다(예:false
). -
polish
: Cloudflare Polish 모드를 설정합니다. 가능한 값은 "lossy", "lossless", "off"입니다(예:lossless
). -
minify
: 다양한 파일 유형에 대해 Cloudflare Autominify를 사용/사용 안함으로 설정하는 웹 사이트 최적화입니다. 값은javascript
,css
및html
에 대한 부울 필드를 포함하는 오브젝트입니다(예:{ javascript: true, css: true, html: false }
). -
mirage
: Cloudflare mirage를 사용/사용 안함으로 설정하는 이미지 최적화입니다. 이 옵션을 지정한 경우 값은 항상false
여야 합니다(예:false
). -
cacheTtl
: 이 옵션은 응답에 표시되는 헤더에 관계없이 CIS가 이 요청에 대한 응답을 강제로 캐싱하도록 설정합니다. 이는 두 개의 페이지 규칙 "에지 캐시 TTL" 및 "캐시 레벨"을 "모두 캐시"로 설정하는 것과 같습니다(예:300
). -
resolveOverride
: 요청 경로를 대체 오리진 서버로 재지정합니다. 이를 사용하여 여러 오리진에서 로드 밸런싱을 구현할 수 있습니다(예:us-east.example.com
).보안을 위해,
resolveOverride
에 설정된 호스트 이름은 수신 요청의 동일한 CIS 구역에서 프록싱되어야 합니다. 그렇지 않으면 설정이 무시됩니다. CNAME 호스트가 허용되므로, 다른 도메인 또는 DNS 전용 도메인의 호스트로 분석하려면 먼저 본인 구역의 DNS 맵핑 내에 있는 CMAP 레코드를 외부 호스트 이름으로 선언하고 CIS에서 프록시를 설정한 다음 해당 CNAME 레코드를 가리키도록 resolveOverride를 설정하십시오.
엔터프라이즈만 해당
cacheKey
: 요청의 캐시 키는 캐싱을 위해 두 요청이 "동일"한지 여부를 판별합니다. 요청의 캐시 키가 이전 요청과 동일할 경우 두 요청에 대해 동일한 캐싱된 응답을 제공할 수 있습니다(예:'some-key'
).cacheTtlByStatus
: 이 옵션은cacheTtl
기능의 버전으로, 응답의 상태 코드를 기준으로 선택됩니다. 이 요청에 대한 응답에 일치하는 상태 코드가 있을 경우 CIS는 지시된 시간 동안 캐싱하고 오리진에서 보낸 캐시 지시사항을 대체합니다(예:{ "200-299": 86400, 404: 1, "500-599": 0 }
). CIS는 여전히 표준 캐시 레벨을 준수하므로 기본적으로 이 값은 정적 파일에 대한 캐시 동작을 대체합니다. 정적이 아닌 자산을 캐시하려면 페이지 규칙을 사용하여 캐시 수준을 모두 캐시로 설정해야 합니다.
Edge Functions 스크립트는 CIS 보안 기능 이후에 실행되지만, 그 외의 모든 기능보다는 먼저 실행됩니다. 따라서 엣지 함수 스크립트는 보안 기능의 작동에는 영향을 줄 수 없지만(이미 완료되었으므로) 이미지 크기 최적화나 엣지에서 응답이 캐시되는 방식과 같은 다른 기능에는 영향을 줄 수 있습니다.
cf
오브젝트의 업데이트는 요청을 수정하는 것과 유사합니다. 사용자 지정 개체를 Request
에 전달하여 cf
개체를 추가할 수 있습니다 fetch
.
// Disable ScrapeShield for this request.
fetch(event.request, { cf: { scrapeShield: false } })
cf
오브젝트의 올바르지 않거나 이름이 잘못된 설정은 자동으로 무시됩니다. 원하는 동작이 발생하는지 테스트할 때 주의를 기울이십시오.
Edge Functions 유스 케이스
다음 예제는 오로지 데모용이며 프로덕션에는 사용되지 않습니다.