TypeScript İşlevi API'siyle Azure kaynak gruplarını yönetme
Bu öğreticide, Azure kaynak gruplarını yönetmek ve uygulamayı Azure'a dağıtmak için API'lerle yerel bir TypeScript Azure İşlevi uygulaması oluşturacaksınız.
Özellikler ve işlevler:
- Visual Studio Code'da yerel TypeScript Azure İşlevi uygulama projesi oluşturma
- Visual Studio Code'da işlev API'sinde ortak kod oluşturma
- Visual Studio Code'dan Azure İşlevleri dağıtma
- Azure CLI ile hizmet sorumlusu oluşturma
- Visual Studio Code ile yerel ve uzak uygulama ayarlarını yapılandırma
- Parolasız bağlantılar için hem yerel hem de uzak ortamlarda DefaultAzureCredential kullanma
- Azure kaynaklarını yönetmek için Azure Kimliği ve Azure Kaynak Yönetimi SDK'larını kullanma
- Aboneliğinizde kaynak grupları oluşturmak, silmek ve listelemek için yerel ve bulut API'lerinizi kullanın
Uyarı
Bu öğretici, hızlı benimsemeye yöneliktir ve bu nedenle varsayılan olarak güvenli gereksinimlere uymaz. Varsayılan olarak güvenli hedefle bu senaryo hakkında daha fazla bilgi edinmek için Güvenlikle ilgili dikkat edilmesi gerekenler bölümüne gidin.
Kaynak kodu TypeScript ile yazılmış olsa da, kaynak kodu basittir. Async/await kullanarak modern JavaScript konusunda rahatsanız kod size tanıdık gelecek.
Önkoşullar
- Azure kullanıcı hesabı ve aboneliği: Ücretsiz abonelik oluşturun.
- Node.js LTS 18+ ve npm yerel makinenize yüklenmiştir. Node.js yerel geliştirme ortamı sürümünüz, kullanılabilir Azure İşlevi bulut çalışma zamanı sürümlerinden biriyle eşleşmelidir.
- Yerel makinenize yüklü Visual Studio Code .
- Azure İşlevi uzantısı v1.10.4 veya üzeri.
- Azure İşlevleri Core Tools v4.0.5095 veya üzeri
- Yerel makinenize yüklenen Azure Cloud Shell veya Azure CLI .
Uygulama mimarisi
Uygulama aşağıdaki API uç noktalarını sağlar.
Metot | URL | Açıklama |
---|---|---|
GÖNDER,SIL | http://localhost:7071/api/resourcegroup | Kaynak grubu ekleme veya silme. Eklerken, daha sonra grubun amacını belirlemek için etiketleri (anahtar/değer çiftleri) ekleyin. |
GET | http://localhost:7071/api/resourcegroups | Abonelikteki tüm kaynak gruplarını listeleyin. |
GET | http://localhost:7071/api/resources | Abonelikteki veya kaynak grubundaki tüm kaynakları listeleyin. |
Bu uç noktalar genel olsa da, canlı ortamınıza dağıtmadan önce kimlik doğrulaması ve yetkilendirme ile API uç noktalarınızın güvenliğini sağlamalısınız .
Bu uygulama, hizmet sorumlusu oluşturulurken belirtilen kapsam olduğundan bir abonelikle sınırlıdır.
1. Ortamınızı hazırlama
Azure Kimlik SDK'sını kullanmak için yerel ve bulut ortamlarınızı hazırlamanız gerekir.
Azure CLI'da oturum açma
Bash terminalinde aşağıdaki komutu kullanarak Azure CLI'da oturum açın:
az login
Azure abonelik kimliğinizi alma
Bash terminalinde aboneliklerinizi alın ve kullanmak istediğiniz abonelik kimliğini bulun. Aşağıdaki sorgu abonelik adına göre sıralanmış abonelik kimliğini, abonelik adını ve kiracı kimliğini döndürür.
az account list --query "sort_by([].{Name:name, SubscriptionId:id, TenantId:tenantId}, &Name)" --output table
Abonelik kimliğini önceki geçici dosyaya kopyalayın. Bu ayara daha sonra ihtiyacınız olacak.
Azure hizmet sorumlusu oluşturma
Azure hizmet sorumlusu, kişisel kullanıcı kimlik bilgilerinizi kullanmak zorunda kalmadan Azure'a erişim sağlar. Bu öğreticide hizmet sorumlusu hem yerel hem de bulut ortamlarınızda kullanılabilir. Kurumsal bir ortamda, her ortam için ayrı hizmet sorumluları isteyebilirsiniz.
Hizmet sorumlunuzu daha sonra kolayca bulabilmeniz için bir hizmet asıl adı biçimi belirleyin. Örneğin, çeşitli biçim fikirleri şunlardır:
- Projeniz ve sahibiniz:
resource-management-john-smith
. - Bölümünüz ve tarihiniz:
IT-2021-September
- Projeniz ve sahibiniz:
Bash terminalinde az ad sp create-for-rbac ile hizmet sorumlunuzu oluşturun. değerini abonelik kimliğiniz ile değiştirin
<SUBSCRIPTION-ID>
.az ad sp create-for-rbac --name YOUR-SERVICE-PRINCIPAL-NAME --role Contributor --scopes /subscriptions/<SUBSCRIPTION-ID>
Çıktı sonuçlarının tamamını geçici bir dosyaya kopyalayın. Bu ayarlara daha sonra ihtiyacınız olacak.
{ "appId": "YOUR-SERVICE-PRINCIPAL-ID", "displayName": "YOUR-SERVICE-PRINCIPAL-NAME", "name": "http://YOUR-SERVICE-PRINCIPAL-NAME", "password": "YOUR-SERVICE-PRINCIPAL-PASSWORD", "tenant": "YOUR-TENANT-ID" }
2. Visual Studio Code'da yerel Azure İşlevi uygulaması oluşturma
Azure kaynak gruplarını yönetmek için Visual Studio Code'da bir Azure İşlevi uygulaması oluşturun.
İşlev uygulaması oluşturma
Yerel bir İşlev uygulaması oluşturmak için Visual Studio Code'u kullanın.
Bash terminalinde oluşturun ve yeni bir dizine geçin:
mkdir my-function-app && cd my-function-app
Bash terminalinde Visual Studio Code'ı açın:
code .
Visual Studio Code komut paletini açın: Ctrl + Shift + p.
Azure Functions: create new project
girin. İstemleri tamamlamak için aşağıdaki tabloyu kullanın:İstem Değer İşlev projenizi içerecek klasörü seçin Varsayılan (geçerli) dizini seçin Dil seçin TypeScript'i seçin. TypeScript programlama modeli seçme Model V4 (Önizleme) seçeneğini belirleme Projenizin ilk işlevi için bir şablon seçin HTTP tetikleyicisi’ni seçin. Yeni HTTP tetikleyicisi oluşturma API adını resourcegroups
girin.Yetkilendirme düzeyi Anonim'i seçin. Bu makaleden sonra bu projeye devam ederseniz yetkilendirme düzeyini işlev olarak değiştirin. İşlev düzeyinde yetkilendirme hakkında daha fazla bilgi edinin. Proje ortak öğesi oluşturulur ve bağımlılıklar yüklenir.
local.settings.json dosyasına hizmet sorumlusu ayarları ekleme
./local.settings.json
Dosyayı proje kök dizininde açın ve aşağıdaki beş ortam değişkeniyle DEĞERLER bölümünüzü ekleyin.{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "", "FUNCTIONS_WORKER_RUNTIME": "node", "AzureWebJobsFeatureFlags": "EnableWorkerIndexing", "AZURE_CLIENT_ID": "REPLACE-WITH-SERVICE-PRINCIPAL-APPID", "AZURE_CLIENT_SECRET": "REPLACE-WITH-SERVICE-PRINCIPAL-PASSWORD", "AZURE_SUBSCRIPTION_ID":"REPLACE-WITH-SUBSCRIPTION-ID", "AZURE_TENANT_ID":"REPLACE-WITH-SERVICE-PRINCIPAL-TENANT", "NODE_ENV":"development" } }
Değerleri eklemek için önceki bölümde yer alan ayarlarınıza bakın. Bu ortam değişkenleri , bağlamın DefaultAzureCredential kullanması için GEREKLIdir.
AZURE_TENANT_ID
:tenant
yukarıdaki hizmet sorumlusu çıkışından.AZURE_CLIENT_ID
:appId
yukarıdaki hizmet sorumlusu çıkışından.AZURE_CLIENT_SECRET
:password
yukarıdaki hizmet sorumlusu çıkışından.
Ayrıca abonelik kimliğini de ayarlamanız gerekir. Kaynak yönetimi için Azure SDK'sını kullanmak gerekir.
AZURE_SUBSCRIPTION_ID
: Kaynak gruplarınızı içeren varsayılan aboneliğiniz.
Bu local.settings.json
dosya, yerel git'iniz tarafından bilerek yoksayılır, böylece dosyayı yanlışlıkla kaynak kodunuzla işlemezsiniz.
Azure Kimlik ve Kaynak yönetimi için npm bağımlılıklarını yükleme
Visual Studio Code tümleşik bash terminalinde, Azure Kimlik ve Kaynak yönetimi için Azure SDK bağımlılıklarını yükleyin.
npm install @azure/identity @azure/arm-resources
JavaScript ile abonelikteki tüm kaynak gruplarını listeleme
./src/functions/resourcegroups.ts
Dosyayı açın ve içeriğini aşağıdakilerle değiştirin:import { ResourceGroup } from '@azure/arm-resources'; import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions'; import { createResourceGroup, deleteResourceGroup } from '../lib/azure-resource-groups'; import { processError } from '../lib/error'; export async function resourcegroup( request: HttpRequest, context: InvocationContext ): Promise<HttpResponseInit> { try { console.log(JSON.stringify(request.query)); console.log(JSON.stringify(request.params)); const name: string = request.query.get('name'); const location: string = request.query.get('location'); console.log(`name: ${name}`); console.log(`location: ${location}`); switch (request.method) { case 'POST': // wait for create to complete before returning if (!name || !location) { return { body: 'Missing required parameters.', status: 400 }; } if (request.headers.get('content-type') === 'application/json') { // create with tags const body: Record<string, unknown> = (await request.json()) as Record<string, string>; const tags: Record<string, string> = body?.tags ? (body?.tags as Record<string, string>) : null; const resourceGroup: ResourceGroup = await createResourceGroup( name, location, tags ); return { jsonBody: resourceGroup, status: 200 }; } else { // create without tags const resourceGroup: ResourceGroup = await createResourceGroup( name, location, null ); return { jsonBody: resourceGroup, status: 200 }; } case 'DELETE': // wait for delete to complete before returning if (!name) { return { body: 'Missing required parameters.', status: 400 }; } await deleteResourceGroup(name); return { status: 204 }; } } catch (err: unknown) { return processError(err); } } app.http('resourcegroup', { methods: ['DELETE', 'POST'], authLevel: 'anonymous', handler: resourcegroup });
Bu dosya, api isteklerine
/api/resourcegroups
yanıt verir ve abonelikteki tüm kaynak gruplarının listesini döndürür.adlı
lib
dizinindesrc
bir alt dizin oluşturun ve bu dizinde adlıazure-resource-groups.ts
yeni bir dosya oluşturun.Aşağıdaki kodu dosyaya
./src/lib/azure-resource-groups.ts
kopyalayın:// Include npm dependencies import { ResourceGroup, ResourceManagementClient } from '@azure/arm-resources'; import { DefaultAzureCredential } from '@azure/identity'; import { getSubscriptionId } from './environment-vars'; const subscriptionId = getSubscriptionId(); // Create Azure authentication credentials const credentials = new DefaultAzureCredential(); // Create Azure SDK client for Resource Management such as resource groups const resourceManagement = new ResourceManagementClient( credentials, subscriptionId ); // all resources groups in subscription export const listResourceGroups = async (): Promise<{ list: ResourceGroup[]; subscriptionId: string; }> => { const list: ResourceGroup[] = []; for await (const resourceGroup of resourceManagement.resourceGroups.list()) { list.push(resourceGroup); } return { subscriptionId, list }; }; export const createResourceGroup = async ( resourceGroupName: string, location: string, tags: { [propertyName: string]: string } ): Promise<ResourceGroup> => { const resourceGroupParameters = { location: location, tags }; return await resourceManagement.resourceGroups.createOrUpdate( resourceGroupName, resourceGroupParameters ); }; export const deleteResourceGroup = async ( resourceGroupName: string ): Promise<void> => { return await resourceManagement.resourceGroups.beginDeleteAndWait( resourceGroupName ); };
Bu dosya aşağıdakileri tamamlar:
- Abonelik kimliğini alır
- DefaultAzureCredential bağlamını oluşturur
- Kaynak yönetimi SDK'sını kullanmak için gereken ResourceManagementClient'ı oluşturur.
- Abonelikteki tüm kaynak gruplarını alır.
adlı
environment-vars.ts
dizinde./src/lib
yeni bir dosya oluşturun ve aşağıdaki kodu bu dosyaya kopyalayın.export const checkAzureAuth = () => { // The following code is only used to check you have environment // variables configured. The DefaultAzureCredential reads your // environment - it doesn't read these variables. const tenantId = process.env['AZURE_TENANT_ID']; if (!tenantId) throw Error('AZURE_TENANT_ID is missing from environment variables.'); const clientId = process.env['AZURE_CLIENT_ID']; if (!clientId) throw Error('AZURE_CLIENT_ID is missing from environment variables.'); const secret = process.env['AZURE_CLIENT_SECRET']; if (!secret) throw Error('AZURE_CLIENT_SECRET is missing from environment variables.'); }; export const getSubscriptionId = (): string => { checkAzureAuth(); // Get subscription from environment variables const subscriptionId = process.env['AZURE_SUBSCRIPTION_ID']; if (!subscriptionId) throw Error('Azure Subscription is missing from environment variables.'); return subscriptionId; };
Bu dosya, abonelik kimliğini döndürmeden önce ortam değişkenlerini denetler.
adlı
error.ts
dizinde./src/lib
yeni bir dosya oluşturun ve aşağıdaki kodu bu dosyaya kopyalayın.export function processError(err: unknown): any { if (typeof err === 'string') { return { body: err.toUpperCase(), status: 500 }; } else if ( err['stack'] && process.env.NODE_ENV.toLowerCase() !== 'production' ) { return { jsonBody: { stack: err['stack'], message: err['message'] } }; } else if (err instanceof Error) { return { body: err.message, status: 500 }; } else { return { body: JSON.stringify(err) }; } }
Bu dosya, hata iletisiyle birlikte 500 hatası döndürür. değişken olarak ayarlı
production
değilseNODE_ENV
yığın döndürülür.
Yerel işlevleri test et
Visual Studio Code tümleşik terminalinde yerel projeyi çalıştırın:
npm start
Tümleşik bash terminali çalışan işlevin URL'sini görüntüleyene kadar bekleyin.
Visual Studio Code, Ctrl + Shift + 5'te ikinci bir tümleşik bash terminali açın ve API'yi kullanmak için aşağıdaki GET cURL komutunu kullanın:
curl http://localhost:7071/api/resourcegroups
Aboneliğinizde çok sayıda kaynak grubu varsa, daha kolay gözden geçirmek için çıkışı bir dosyaya yöneltmek isteyebilirsiniz.
curl http://localhost:7071/api/resourcegroups > resourcegroups.json
Yanıt, bu
list
abonelikteki tüm kaynak gruplarını içerirsubscriptionId
.{ "subscriptionId": "ABC123", "list": [ { "id": "/subscriptions/ABC123/resourceGroups/vmagelo-cloudshell", "name": "jsmith-cloudshell", "type": "Microsoft.Resources/resourceGroups", "properties": { "provisioningState": "Succeeded" }, "location": "westeurope" }, ... REMOVED FOR BREVITY ... ] }
Sorun giderme
Bu makaleyi tamamlayamadıysanız, sorunlar için aşağıdaki tabloya bakın. Sorununuz tabloda listelenmiyorsa, bu belge sayfasında bir sorun açın.
Sorun | Düzeltme |
---|---|
Uygulama başlatılmadı. | Hataları gözden geçirin. Gerekli bağımlılıkları yüklediğinizden emin olun. |
Uygulama başlatıldı ancak 200 yanıt alamazsınız. | Curl komutunun doğru yerel yoldan istediğinden emin olun. |
API 200 yanıt döndürdü ancak sonuç döndürmedi. | Aboneliğinizde herhangi bir kaynak grubu olduğunu doğrulamak için Azure Kaynakları için Visual Studio Code uzantısını kullanın. Herhangi bir kaynak grubu görmüyorsanız endişelenmeyin. Bu öğretici, aboneliğinizde kaynak grupları oluşturmak ve silmek için bir API ekler. Bu API, kaynak kodun Azure'a ilk dağıtımından sonra eklenerek kodunuzun nasıl yeniden dağıtıldığını öğrenmeniz sağlanır. |
3. Bulut tabanlı Azure İşlevi uygulaması oluşturma
Visual Studio Code'da Azure simgesini seçerek Azure Gezgini'ni açın.
Simgeyi + seçerek Azure bulutunda yeni bir Azure İşlevi uygulaması oluşturun.
Azure'da İşlev Uygulaması Oluştur'u seçin.
Yeni işlev uygulaması için genel olarak benzersiz bir ad girin. Ad tüm Azure işlevlerinde benzersiz olmalıdır. Örneğin,
jsmith-rg-management
.Yerel işlev uygulamanızı oluştururken seçtiğiniz Node.js 18+ LTS çalışma zamanını seçin.
Batı ABD 3 gibi size yakın bir coğrafi konum seçin.
Kaynak oluşturulana kadar bekleyin. Ayrıntılar için Azure: Etkinlik Günlüğü'nü izleyebilirsiniz.
4. Bulut tabanlı Azure İşlevi uygulamasını yapılandırma
Azure İşlevi uygulamasına bağlanmak için Azure uygulama ayarlarınızı yapılandırmanız gerekir. Yerel olarak, bu ayarlar dosyanızda local.settings.json
bulunur. Bu işlem bu değerleri bulut uygulamanıza ekler.
Visual Studio Code'da, Azure gezgininin Kaynaklar bölümünde İşlev Uygulaması'nı genişletin ve işlev uygulamanızı seçin.
Uygulama Ayarları'nı sağ tıklatın ve Yeni Ayar Ekle'yi seçin.
dosyanızdaki
local.settings.json
dört değeri tam olarak aynı ad ve değerlerle ekleyin.AZURE_TENANT_ID
:tenant
yukarıdaki hizmet sorumlusu çıkışından.AZURE_CLIENT_ID
:appId
yukarıdaki hizmet sorumlusu çıkışından.AZURE_CLIENT_SECRET
:password
yukarıdaki hizmet sorumlusu çıkışından.AZURE_SUBSCRIPTION_ID
: Kaynak gruplarınızı içeren varsayılan aboneliğiniz.AzureWebJobsFeatureFlags
:EnableWorkerIndexing
5. Resource Manager işlev uygulamasını dağıtma
Azure kaynak gruplarını yönetmek için Visual Studio Code'da bir Azure İşlevi uygulaması dağıtın.
Barındırma ortamına dağıtmak için Visual Studio Code uzantısını kullanma
VS Code'da, görünür olması için dosyayı açın
local.settings.json
. Bu, bu adları ve değerleri kopyalama işleminin sonraki adımlarını kolaylaştırır.Azure Gezgini'ni açmak için Azure logosunu seçin, ardından İşlevler'in altında bulut simgesini seçerek uygulamanızı dağıtın.
Alternatif olarak, Komut Paleti'ni Ctrl + Shift + p ile açarak, girin
deploy to function app
ve Azure İşlevleri: İşlev Uygulamasına Dağıt komutunu çalıştırarak dağıtabilirsiniz.İşlev uygulamasına dağıt'ı seçin.
Önceki bölümde oluşturduğunuz İşlev Uygulaması adını seçin.
Dağıtmak istediğinizden emin olup olmadığınız sorulduğunda Dağıt'ı seçin.
Azure İşlevleri için VS Code Çıktı paneli ilerleme durumunu gösterir. Dağıtım sırasında İşlevler uygulamasının tamamı dağıtılır, bu nedenle tek tek tüm işlevlerde yapılan değişiklikler aynı anda dağıtılır.
İşlevler uygulamasının tarayıcıyla kullanılabilir olduğunu doğrulama
Visual Studio Code'dayken Azure İşlevleri gezginini kullanın, Azure aboneliğinizin düğümünü genişletin, İşlevler uygulamanızın düğümünü genişletin ve ardından İşlevler (salt okunur) seçeneğini genişletin. İşlev adına sağ tıklayın ve İşlev Url'sini Kopyala'yı seçin:
URL'yi bir tarayıcıya yapıştırın ve bulut API'sinden kaynak grubu listesini istemek için Enter tuşuna basın.
6. İşlev uygulamasına API ekleme ve Azure'a yeniden dağıtma
Aşağıdaki API'leri ekleyin ve Ardından Visual Studio Code'da Azure İşlevi uygulamanızı yeniden dağıtın:
- Kaynak grupları ekleme ve silme
- Kaynak grubu veya abonelikteki kaynakları listeleyin.
Öğreticinin bu noktasında, aboneliğinizin kaynak gruplarını listelemek için bir API ile yerel bir işlev uygulaması oluşturdunuz ve bu uygulamayı Azure'a dağıttınız. Azure geliştiricisi olarak, işlem otomasyonu işlem hattınızın bir parçası olarak kaynak grupları oluşturmak veya silmek isteyebilirsiniz.
İşlev uygulamanız için resourcegroup API'sini oluşturma
Azure İşlevleri için Visual Studio Code uzantısını kullanarak işlev uygulamanıza TypeScript dosyalarını ekleyerek kaynak gruplarını oluşturun ve silin.
Visual Studio Code komut paletini açın: Ctrl + Shift + p.
Enter tuşuna
Azure Functions: Create Function
basın ve işlemi başlatmak için enter tuşuna basın./api/resourcegroup API'sini oluşturmak için aşağıdaki tabloyu kullanın:
İstem Değer İşleviniz için şablon seçme HTTP tetikleyicisi İşlev adı belirtin resourcegroup
Yetkilendirme düzeyi Anonim'i seçin. Bu projeye devam ederseniz yetkilendirme düzeyini işlev olarak değiştirin. İşlev düzeyinde yetkilendirme hakkında daha fazla bilgi edinin. ./src/functions/resourcegroup.ts
dosyasını açın ve dosyasının tamamını aşağıdaki kaynak koduyla değiştirin.import { ResourceGroup } from '@azure/arm-resources'; import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions'; import { createResourceGroup, deleteResourceGroup } from '../lib/azure-resource-groups'; import { processError } from '../lib/error'; export async function resourcegroup( request: HttpRequest, context: InvocationContext ): Promise<HttpResponseInit> { try { console.log(JSON.stringify(request.query)); console.log(JSON.stringify(request.params)); const name: string = request.query.get('name'); const location: string = request.query.get('location'); console.log(`name: ${name}`); console.log(`location: ${location}`); switch (request.method) { case 'POST': // wait for create to complete before returning if (!name || !location) { return { body: 'Missing required parameters.', status: 400 }; } if (request.headers.get('content-type') === 'application/json') { // create with tags const body: Record<string, unknown> = (await request.json()) as Record<string, string>; const tags: Record<string, string> = body?.tags ? (body?.tags as Record<string, string>) : null; const resourceGroup: ResourceGroup = await createResourceGroup( name, location, tags ); return { jsonBody: resourceGroup, status: 200 }; } else { // create without tags const resourceGroup: ResourceGroup = await createResourceGroup( name, location, null ); return { jsonBody: resourceGroup, status: 200 }; } case 'DELETE': // wait for delete to complete before returning if (!name) { return { body: 'Missing required parameters.', status: 400 }; } await deleteResourceGroup(name); return { status: 204 }; } } catch (err: unknown) { return processError(err); } } app.http('resourcegroup', { methods: ['DELETE', 'POST'], authLevel: 'anonymous', handler: resourcegroup });
Dosya zaten
./src/lib/azure-resource-groups.ts
kaynak grupları eklemek ve silmek için gereken kodu içerir.
İşlev uygulamanız için kaynak API'sini oluşturma
Bir kaynak grubundaki kaynakları listelemek üzere işlev uygulamanıza TypeScript dosyalarını eklemek üzere Azure İşlevleri için Visual Studio Code uzantısını kullanın.
Visual Studio Code komut paletini açın: Ctrl + Shift + p.
Enter tuşuna
Azure Functions: Create Function
basın ve işlemi başlatmak için enter tuşuna basın./api/resources API'sini oluşturmak için aşağıdaki tabloyu kullanın:
İstem Değer İşleviniz için şablon seçme HTTP tetikleyicisi İşlev adı belirtin resources
Yetkilendirme düzeyi Anonim'i seçin. Bu projeye devam ederseniz yetkilendirme düzeyini işlev olarak değiştirin. İşlev düzeyinde yetkilendirme hakkında daha fazla bilgi edinin. ./src/functions/resources.ts
dosyasını açın ve dosyasının tamamını aşağıdaki kaynak koduyla değiştirin.import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions'; import { listResourceByResourceGroup, listResourceBySubscription } from '../lib/azure-resource'; import { processError } from '../lib/error'; export async function resources( request: HttpRequest, context: InvocationContext ): Promise<HttpResponseInit> { try { const resourceGroupName: string = request.query.get('resourceGroupName'); context.log(`resourceGroupName: '${resourceGroupName}'`); if (resourceGroupName) { const resourcesByName = await listResourceByResourceGroup( resourceGroupName ); return { jsonBody: resourcesByName }; } else { const resourcesBySubscription = await listResourceBySubscription(); return { jsonBody: resourcesBySubscription }; } } catch (err: unknown) { return processError(err); } } app.http('resources', { methods: ['GET'], authLevel: 'anonymous', handler: resources });
Bir kaynak grubundaki
./src/lib/azure-resource.ts
kaynakları listelemek için dosyayı oluşturun ve aşağıdaki kodu bu dosyaya kopyalayın.// Include npm dependencies import { Resource, ResourceManagementClient } from '@azure/arm-resources'; import { DefaultAzureCredential } from '@azure/identity'; import { getSubscriptionId } from './environment-vars'; const subscriptionId = getSubscriptionId(); // Create Azure authentication credentials const credentials = new DefaultAzureCredential(); // Create Azure SDK client for Resource Management such as resource groups const resourceManagement = new ResourceManagementClient( credentials, subscriptionId ); // all resources groups in subscription export const listResourceBySubscription = async (): Promise<{ list: Resource[]; subscriptionId: string; }> => { const list: Resource[] = []; for await (const resource of resourceManagement.resources.list()) { list.push(resource); } return { subscriptionId, list }; }; // all resources groups in resource group export const listResourceByResourceGroup = async ( resourceGroupName: string ): Promise<{ list: Resource[]; subscriptionId: string; resourceGroupName: string; }> => { const list: Resource[] = []; for await (const resource of resourceManagement.resources.listByResourceGroup( resourceGroupName )) { list.push(resource); } return { subscriptionId, resourceGroupName, list }; };
Yerel işlev uygulamanızı başlatın ve yeni API'yi test edin
Visual Studio Code tümleşik terminalinde yerel projeyi çalıştırın:
npm start
Tümleşik bash terminali çalışan işlevin URL'sini görüntüleyene kadar bekleyin.
Api'nizi çağırmak ve aboneliğinize bir kaynak grubu eklemek için farklı bir tümleşik bash terminalinde aşağıdaki curl komutlarını kullanın. Kendi adlandırma kurallarınızı kullanmak için kaynak grubunun adını değiştirin.
curl -X POST 'http://localhost:7071/api/resourcegroup?name=my-test-1&location=westus' curl -X POST 'http://localhost:7071/api/resourcegroup?name=my-test-1&location=westus' \ -H 'content-type: application/json' \ -d '{"tags": {"a":"b"}}'
Aboneliğinizde listelenen yeni kaynak grubunu görmek için aşağıdaki curl komutunu kullanın.
curl http://localhost:7071/api/resource-groups
Yeni eklediğiniz kaynak grubunu silmek için aşağıdaki curl komutunu kullanın.
curl -X DELETE 'http://localhost:7071/api/resourcegroup?name=my-test-1' \ -H 'Content-Type: application/json'
İşlev uygulamanızı yeni API'lerle Azure'a yeniden dağıtma
VS Code'da, Komut Paleti'ni Ctrl + Shift + p ile açarak, girin
deploy to function app
ve Azure İşlevleri: İşlev Uygulamasına Dağıt komutunu çalıştırarak dağıtın.Uygulama listesinden işlev uygulamanızı seçin.
Açılır pencerede Dağıt'ı seçin.
Dağıtım tamamlanana kadar bekleyin.
tarayıcı ile İşlev API'lerini doğrulama
Localhost adresini http://localhost:7071
gibi Azure İşlevi kaynak adınızla https://myfunction.azurewebsites.net
değiştirerek önceki cURL komutlarını kullanın.
7. İşlev uygulaması günlüklerinizi görüntüleme ve sorgulama
Azure portalında Azure İşlevi uygulama günlüklerini görüntüleyin ve sorgular.
Azure İşlevi günlüklerinizi sorgulama
İşlev günlüklerinizi görüntülemek ve sorgulamak için Azure portalını kullanın.
VS Code'da Azure gezginini açmak için Azure logosunu seçin, ardından İşlevler'in altında işlev uygulamanıza sağ tıklayın ve portalda aç'ı seçin.
Bu, Azure portalını Azure İşlevinize açar.
Ayarlar'dan Application Insights'ı ve ardından Application Insights verilerini görüntüle'yi seçin.
Bu bağlantı, VS Code ile Azure İşlevinizi oluştururken sizin için oluşturulan ayrı ölçüm kaynağınıza götürür.
İzleme bölümünde Günlükler'i seçin. Sorgular açılır penceresi görüntülenirse, kapatmak için açılır pencerenin sağ üst köşesindeki X işaretini seçin.
Şema ve Filtre bölmesindeki Tablolar sekmesinde izlemeler tablosuna çift tıklayın.
Bu işlem Kusto
traces
sorgusunu sorgu penceresine girer.API çağrılarını aramak için sorguyu düzenleyin:
traces | where message startswith "Executing "
Çalıştır seçin.
Günlükte herhangi bir sonuç görüntülenmiyorsa bunun nedeni Azure İşlevi'ne http isteği ile Kusto'daki günlük kullanılabilirliği arasında birkaç dakika gecikme olması olabilir. Birkaç dakika bekleyin ve sorguyu yeniden çalıştırın.
Azure İşlevi uygulamasını oluştururken sizin için bir Application Insights kaynağı eklendiğinden, bu günlük bilgilerini almak için ek bir işlem yapmanız gerekmez:
- İşlev uygulaması sizin için Application Insights ekledi.
- Sorgu aracı Azure portalına eklenir.
- Günlüklerinizden minimum bilgileri bile almak için kusto sorgusu yazmayı öğrenmek zorunda kalmadan seçebilirsiniz
traces
.
8. Azure kaynaklarını temizleme
Kaynak grubunu silme
VS Code'da Azure gezginini açmak için Azure logosunu seçin, ardından İşlevler'in altında işlev uygulamanıza sağ tıklayın ve portalda aç'ı seçin. Bu, Azure portalını Azure İşlevinize açar.
Genel Bakış bölümünde kaynak grubu adını bulun ve seçin. Bu eylem sizi Azure portalındaki kaynak grubuna götürür.
Kaynak grubu sayfasında bu öğreticiyle ilişkili tüm kaynaklar listelenir.
Üstteki menüde Kaynak grubunu sil'i seçin.
Yan menüde kaynak grubunun adını girin ve Sil'i seçin.
Hizmet sorumlusunu silme
Hizmet sorumlusunu silmek için aşağıdaki komutu çalıştırın. değerini hizmet sorumlunuzun adıyla değiştirin <YOUR-SERVICE-PRINCIPAL-NAME>
.
az ad sp delete --id <YOUR-SERVICE-PRINCIPAL-NAME>
Örnek kod
Güvenlik konuları
Bu çözüm, başlangıç öğreticisi olarak varsayılan olarak güvenli uygulamaları göstermez. Bu, çözümü dağıtmada başarılı olmanıza olanak sağlamak için bilerek yapılır. Bu başarılı dağıtımdan sonraki adım, kaynakların güvenliğini sağlamaktır. Bu çözüm üç Azure hizmeti kullanır ve her birinin kendi güvenlik özellikleri ve varsayılan olarak güvenli yapılandırma ile ilgili dikkat edilmesi gerekenler vardır:
- Azure İşlevleri - Azure İşlevleri güvenliğini sağlama
- Azure Depolama - Blob depolama için güvenlik önerileri