做云简历
#网络开发人员 #python #云 #azure

Cloud Resume Challenge为开发人员提供了一个令人兴奋的机会,可以深入研究云中的完整堆栈静态网站开发。我在浏览另一个开发人员的简历时偶然发现了这一挑战,我立即感到不得不接受。

挑战的目的是通过创建在云中托管的在线简历来为开发人员提供对云应用程序的全面了解。尽管从理论上讲,该概念似乎很简单,但实际实现涉及Web开发,网络,数据库和API概念,基础架构AS-CODE(IAC),源控制和CI/CD的各个方面。

Infra overview

在这篇博客文章中,我将分享我创建自己的云简历的旅程,希望它可以作为指导,并激发他人在云发展中面临新的挑战。

让我们开始吧

为了启动该项目,从功能上的前端开始是非常有意义的。在尝试了各种设计之后,我选择从现有简历中汲取灵感来为我的网站的初始版本汲取灵感。为此,我要归功于Stacy Stipe,他的网站是我自己的简历的基础,尽管具有一些个性化的CSS和响应性提高。

有一个工作前端,下一步是找到托管解决方案。云履历挑战提供了多个云提供商选项,经过仔细考虑,我选择利用Microsoft Azure。我已经在公司的数据存储和转换中使用了Azure,我很想了解其功能。

Microsoft Azure

值得庆幸的是,在Azure托管一个静态网站具有成本效益(以后再成本)和直接。 Azure存储帐户可以在Blob存储中使用$web容器配置,以托管您的静态内容。这是可以部署到Azure的示例配置:

{
            "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
            "apiVersion": "2022-09-01",
            "name": "[concat(parameters('storageAccounts_resumeaccount_name'), '/default/$web')]",
            "dependsOn": [
                "[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_resumeaccount_name'), 'default')]",
                "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_resumeaccount_name'))]"
            ],
            "properties": {
                "immutableStorageWithVersioning": {
                    "enabled": false
                },
                "defaultEncryptionScope": "$account-encryption-key",
                "denyEncryptionScopeOverride": false,
                "publicAccess": "None"
            }
        },

这是我存储前端文件的地方,包括图像和纸质简历的副本,供访问者下载。

$Web container with file contents

全做完了! (不是...)

在这一点上,您可以说我已经完成了:我创建了一个可公开访问的云托管简历网站。但这不是我很乐意与任何认真的雇主分享,也不满足挑战的所有要求。

该网站不安全,只能通过HTTP访问。每次我进行更改时,我都在手动将网站的index.html上传到Azure。修改源后,内容更新很慢。我没有定制域来指向访问者。有很多问题要解决。

Azure CDN可以解决其中一些问题。首先,我为我的静态内容创建了一个终点,以便从全球不同位置(也称为内容缓存)提供。这加快了内容交付的速度,作为奖励,它允许HTTPS连接到我的网站。这就是使用IAC的样子:

{
            "type": "Microsoft.Cdn/profiles/endpoints",
            "apiVersion": "2022-11-01-preview",
            "name": "[concat(parameters('profiles_ResumeCDN_name'), '/ArmbristerCloudResume')]",
            "location": "Global",
            "dependsOn": [
                "[resourceId('Microsoft.Cdn/profiles', parameters('profiles_ResumeCDN_name'))]"
            ],
            "properties": {
                "originHostHeader": "resumeaccount.z13.web.core.windows.net",
                "isCompressionEnabled": true,
                "isHttpAllowed": true,
                "isHttpsAllowed": true,
                "queryStringCachingBehavior": "BypassCaching",
                "origins": [
                    {
                        "name": "resumeaccount-z13-web-core-windows-net",
                        "properties": {
                            "hostName": "resumeaccount.z13.web.core.windows.net",
                            "priority": 1,
                            "weight": 1000,
                            "enabled": true
                        }
                    }
                ],
                "originGroups": [],
                "geoFilters": [],
                "deliveryPolicy": {
                    "rules": []
                }
            }
        },

将此代码部署到Azure为内容缓存和HTTPS功能创建CDN端点。

接下来,我需要解决网络,特别是获得自定义域和管理域路由。我选择Godaddy作为我的DNS提供商,并注册了我的域:bristercloud.com。最初,我试图使用GoDaddy名称服务器来管理我的DNS记录,但是经过大量的反复试验,我选择使用Azure的名称服务器。这使我对Azure DNS区域内的域路由的控制权得到了更大的控制。新的DNS记录允许从其他子域访问该网站(例如www)。

IP configurations

Python:让我们写一个API

挑战需要在网站上包含页面视图计数器,该网站必须使用Azure Services和Python API来完成。换句话说,是时候发展后端了。

首先,我需要一个存储当前页面视图计数的地方。 Azure的CosmosDB是该任务的出色非关系数据库。我在Cosmos DB中创建了一个名为pageviews的表,以存储当前计数。 pageviews table

每当我的页面加载时,我的API应该检索当前计数,将其增加1,更新表并将新值返回到前端。

使用python(和健康剂量的Microsoft Documentation),我能够使用koude4 Python库来创建一个HTTP触发器,该触发触发触发器,该触发触发触发器,该触发器可以接受获得请求和与cosmosdb的接口。这使我的API可以阅读和更新PageViewCount

接下来,我在应用程序服务计划中创建了一个Function App,以托管Azure的后端代码。每当我想检索新的PageViewCount时,此功能将是我的前端调用的端点。

function app with HTTP trigger

重要说明如果您遵循:确保在您的功能应用中启用CORS(交叉原始资源共享);否则,您的网站将在访问您的功能方面存在问题。 CORS configuration

要把它们全部绑在一起,我写了一些JavaScript来调用API并更新着陆页:

    const url="https://pageviewcounterfunction.azurewebsites.net/api/pageviews?PartitionKey=pageviewcount"

    const xhr = new XMLHttpRequest();
    xhr.open("GET", url);
    xhr.send();
    xhr.responseType = "json";
    xhr.onload = () => {
      if (xhr.readyState == 4 && xhr.status == 200) {
        const pageViewCount = xhr.response;
        document.getElementById("guestNumber").innerHTML = pageViewCount;
        console.log(data);
      } else {
        console.log(`Error: ${xhr.status}`);
      }
    };

包起来!

将项目结束并使其真正感觉像现代的云应用程序,挑战要求源控制,IAC和CI/CD。

我首先将前端和后端内容迁移到github。然后,我设置了GitHub Actions来运行Python测试脚本,并在将本地代码推到我的主分支时将代码部署到Azure。此外,我设置了一个用于配置和部署新资源的ARM template。这是我完成后的前端存储库:

Front end github repo

在进行这些更改之前,代码是手动部署的。值得庆幸的是,VS代码的Azure Tools通过允许我直接从IDE部署来充当代码部署的临时解决方案。但是,如果没有github操作,我不得不手动清除CDN粘贴以检索最新代码并手动执行我的测试。

挑战是最后列出的这些要求,但我强烈建议任何人应对挑战开始。从长远来看,利用GitHub动作和ARM模板可以节省数小时的时间,来消除环境中资源的手动测试,部署和配置。

成本和结论

我的产品经理不能忽略成本,云技术涉及的潜在成本可能会阻止其他人尝试此类项目。那么,云简历挑战的成本是多少?

令人惊讶的是,整个项目中最昂贵的部分是自定义域。虽然费用根据需求而有所不同,但由于Godaddy的促销活动,我的域名第一年的费用仅为我3.17美元,之后每年为11.99美元。但是,重要的是要注意,完成项目并不需要自定义域。但是,如果您打算使用此简历申请新职位,则值得考虑一个自定义领域。

其他一切的成本?自由的。

Microsoft的学分非常慷慨,在我注册时为像我这样的开发人员提供了200美元的免费积分。即使经过数百个API呼叫和现场访问,Azure服务的成本,在Blob存储,DNS服务,CDN,COSMOS DB存储以及其他所有用于完成这些项目的Azure服务中,检索和修改文件的费用,并不到$ 1//月。 Cost management screen

如果您像我一样,打开Azure门户时的第一件事是设置budget alerts,则不必担心。即使涉及一些费用,奖励也更有价值。

由于这一挑战,我现在更加精通Azure。
我感谢该项目的实用性,因为它涵盖了各种各样的发展原则,并为我提供了向潜在雇主展示辛勤工作的地方。对于希望扩大云技能的任何人,尤其是那些可能很快即将毕业并考虑从事云技术职业的学生,​​这个项目都是很棒的。

我希望这能激发您迈出下一步! Feel free to check out my finished resume!