Terraform을 사용하여 Azure 기능 코드 배포
17935 단어 serverlessterraformdevopsazure
이 글은 Terraform이 있는 함수 프로그램에 코드를 발표하는 방법에 주목한다.여기에 배치된 응용 프로그램은 Hello World 노드입니다.js 함수이지만 과정은 언어와 무관합니다.
패키지 파일을 사용하는 것이 recommended way Azure 기능을 실행하는 관건이다.새 코드를 올릴 때 스위치는 원자입니다. (즉 안전합니다.)성능이 더욱 좋고, 냉각 가동이 더욱 빠르다.상응하는 가방을 가리키면 이전의 배치로 돌아가기 쉽다.
패키지 배치는 두 가지 모델이 있는데 그것이 바로 URL과 응용 프로그램 서비스이다.우리는 두 가지 장점과 한계, 그리고 Terraform으로 이를 어떻게 실현하는지 보게 될 것이다.
Github에서 Linux/Windows+소비/고급 설정 코드.
패키지에서 배포
간단히 말하면 패키지에서 패키지(zip 파일)를 가져와 읽기 전용
/home/site/wwwroot
디렉터리에 내용을 불러오는 것을 의미한다.원본 패키지는 원격 메모리에 저장할 수도 있고
/home/data/SitePackages
디렉터리에 있는 응용 프로그램 서비스에 업로드할 수도 있다.배치 모드는
WEBSITE_RUN_FROM_PACKAGE
응용 프로그램 설정에 의해 결정됩니다.원격 스토리지 패키지
저장소는 프로그램 서비스가 실행될 때 패키지를 다운로드할 수 있는 모든 것이 될 수 있다.이것은 이 옵션의 단점을 돋보이게 한다. 프로그램을 다시 시작할 때마다 zip은 저장소에서 다시 다운로드해야 한다.
가장 일반적인 방법은 Blob 스토리지에 패키지를 호스팅하고 기능 어플리케이션 구성을 통해 패키지에 대한 제한된 액세스를 부여하는 SAS URL을 생성하는 것입니다.
WEBSITE_RUN_FROM_PACKAGE = URL with SAS
이것은 이러한 구축 방법의 또 다른 불편한 점이다.When running a function app on Windows, the external URL option yields worse cold-start performance. When deploying your function app to Windows, you should set WEBSITE_RUN_FROM_PACKAGE to 1 and publish with zip deployment.
좋은 측면에서 볼 때, Linux와 Windows 환경은 소비와 고급 계획에서 패키지 URL에서 실행되는 것을 잘 지원한다.
패키지 애플리케이션 내 서비스
배치할 때 패키지가
/home/data/SitePackages
디렉터리에 업로드됩니다.이 디렉토리에는 현재 사용 중인 패키지의 이름만 포함하는 packagename.txt
파일이 있습니다.파일을 수동으로 업데이트하여 다른 패키지를 가리키면 기능 애플리케이션이 곧 재부팅되고 해당 패키지의 코드가 사용됩니다.소프트웨어 패키지를 애플리케이션 서비스에 업로드하려면 Zip Deployment 정책을 사용하고 애플리케이션 설정과 함께 사용해야 합니다.
WEBSITE_RUN_FROM_PACKAGE = 1
만약 응용 설정이 없다면, zip배치는 간단하게 패키지를 /home/site/wwwroot
디렉터리로 압축하여 패키지배치에서 실행하는 모든 장점을 잃게 될 것이다.기능 응용 프로그램이 시작될 때 네트워크를 통해 패키지를 다운로드할 필요가 없기 때문에 더욱 빨리 냉각 시작을 할 수 있어야 한다.
2021년 3월까지 Linux 소비에서는 지원되지 않습니다
WEBSITE_RUN_FROM_PACKAGE = 1
.하지만 Windows 호스트와 Linux Premium은 잘 어울릴 수 있습니다.Terraform 배포 코드 사용
간단하게 보기 위해서, 기본적인 Azure 기능인 Terraform 스크립트를 준비했다고 가정합니다.
또는 본고companion repository를 참고하여 서로 다른 환경에서의 완전한 배치 예시를 이해한다.
이제 Azure에 코드를 게시/업로드하는 데 필요한 사항을 살펴보겠습니다.
WEBSITE_RUN_FROM_PACKAGE = <url>
Adrian HallAzure에서 코드를 저장하고 배치하는 과정을 아주 좋은 글이 있습니다.나는 이 해결 방안을 다시 복습하고 갱신
azurerm_storage_account_blob_container_sas
된Terraform 자원을 강조하며 npm에 의존하지 않는 상황에서Terraform 압축 코드를 사용하는 것을 권장한다.더 간단한 함수는 외부 모듈을 사용하지 않을 수도 있으니 노드를 사용하지 않는 것이 좋다.js와 NPM은 배치 환경의 의존항입니다.이 두 가지 배치 모델에 대해 우리는 업로드할 기능 코드를 압축해야 한다.이를 위해
archive_file
데이터 형식을 사용할 수 있습니다.data "archive_file" "file_function_app" {
type = "zip"
source_dir = "../function-app"
output_path = "function-app.zip"
}
Azure 저장소 Blob에 아카이브 업로드:resource "azurerm_storage_blob" "storage_blob" {
name = "${filesha256(var.archive_file.output_path)}.zip"
storage_account_name = azurerm_storage_account.storage_account.name
storage_container_name = azurerm_storage_container.storage_container.name
type = "Block"
source = var.archive_file.output_path
}
Blob용 읽기 전용 SAS를 만듭니다.만료 날짜 주의 - 이 날짜를 초과하면 기능 프로그램의 확장/리셋 작업이 실패합니다. 패키지 링크가 더 이상 작동하지 않기 때문입니다.여기서는 Service SAS를 사용하는 것이 가장 좋은 선택이다. azurerm_storage_account_sas
생성된 계정 SA에 비해 제한된 접근 권한을 제공하기 때문이다.data "azurerm_storage_account_blob_container_sas" "storage_account_blob_container_sas" {
connection_string = azurerm_storage_account.storage_account.primary_connection_string
container_name = azurerm_storage_container.storage_container.name
start = "2021-01-01T00:00:00Z"
expiry = "2022-01-01T00:00:00Z"
permissions {
read = true
add = false
create = false
write = false
delete = false
list = false
}
}
마지막으로WEBSITE_RUN_FROM_PACKAGE
애플리케이션 설정에 전체 패키지 URL을 제공합니다.resource "azurerm_function_app" "function_app" {
name = "${var.project}-function-app"
resource_group_name = azurerm_resource_group.resource_group.name
location = var.location
app_service_plan_id = azurerm_app_service_plan.app_service_plan.id
app_settings = {
"WEBSITE_RUN_FROM_PACKAGE" = "https://${azurerm_storage_account.storage_account.name}.blob.core.windows.net/${azurerm_storage_container.storage_container.name}/${azurerm_storage_blob.storage_blob.name}${data.azurerm_storage_account_blob_container_sas.storage_account_blob_container_sas.sas}",
"FUNCTIONS_WORKER_RUNTIME" = "node",
"AzureWebJobsDisableHomepage" = "true",
}
os_type = "linux"
site_config {
linux_fx_version = "node|14"
use_32_bit_worker_process = false
}
storage_account_name = azurerm_storage_account.storage_account.name
storage_account_access_key = azurerm_storage_account.storage_account.primary_access_key
version = "~3"
}
이렇게terraform apply
가 실행되면 패키지를 준비하여 스토리지에 업로드하고 링크를 생성하여 애플리케이션 설정에 배치합니다.기능 프로그램이 다시 시작되고, 몇 초 후에 프로그램이 새 코드를 실행할 것입니다.WEBSITE_RUN_FROM_PACKAGE = 1
포장 지퍼 준비:data "archive_file" "file_function_app" {
type = "zip"
source_dir = "../function-app"
output_path = "function-app.zip"
}
파일 시스템에서 패키지를 사용할 수 있도록 WEBSITE_RUN_FROM_PACKAGE
설정 function app를 사용합니다.resource "azurerm_function_app" "function_app" {
name = "${var.project}-function-app"
resource_group_name = azurerm_resource_group.resource_group.name
location = var.location
app_service_plan_id = azurerm_app_service_plan.app_service_plan.id
app_settings = {
"WEBSITE_RUN_FROM_PACKAGE" = "1",
"FUNCTIONS_WORKER_RUNTIME" = "node",
"AzureWebJobsDisableHomepage" = "true",
}
os_type = "linux"
site_config {
linux_fx_version = "node|14"
use_32_bit_worker_process = false
}
storage_account_name = azurerm_storage_account.storage_account.name
storage_account_access_key = azurerm_storage_account.storage_account.primary_access_key
version = "~3"
}
코드는 Azure CLI 명령을 통해 함수 애플리케이션으로 푸시됩니다.locals {
publish_code_command = "az webapp deployment source config-zip --resource-group ${azurerm_resource_group.resource_group.name} --name ${azurerm_function_app.function_app.name} --src ${var.archive_file.output_path}"
}
우리는 null_resource
를 사용하여publish 명령을 실행합니다.패키지 파일의 컨텐트가 변경될 때마다 트리거됩니다.만약 변화가 없다면 코드는 업로드되지 않을 것이다. (일리가 있다.)resource "null_resource" "function_app_publish" {
provisioner "local-exec" {
command = local.publish_code_command
}
depends_on = [local.publish_code_command]
triggers = {
input_json = filemd5(var.archive_file.output_path)
publish_code_command = local.publish_code_command
}
}
보시다시피, 이런 방법은 더욱 간단합니다. 앞에서 논의한 바와 같이, 그것은 더욱 빠른 냉각 가동을 초래할 것입니다.따라서 Linux 소비에서 실행되지 않으면 이 방법을 사용하십시오.도구책
...
게시된 추가 의존항에만 사용하지 않으려면 Terraform을 사용하여Azure 기능, 자원, 코드를 배치할 수 있습니다.
만약 당신이 이런 내용을 좋아한다면 트위터에서 최신 업데이트를 얻을 수 있습니다.
Reference
이 문제에 관하여(Terraform을 사용하여 Azure 기능 코드 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/maxivanov/deploy-azure-functions-code-with-terraform-1h8b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)