{"id":47365,"date":"2023-11-24T02:35:06","date_gmt":"2023-09-30T22:10:31","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/"},"modified":"2024-05-04T10:31:08","modified_gmt":"2024-05-04T02:31:08","slug":"%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/","title":{"rendered":"\u6211\u628a Azure \u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230 Azure Blob \u4e2d\u8bd5\u8bd5\u770b"},"content":{"rendered":"<h2>\u7b80\u8981\u6982\u8ff0<\/h2>\n<p>\u6211\u5c06\u8fd9\u4e2a\u7a0b\u5e8f\uff08\u4f7f\u7528Python\u4eceAzure\u83b7\u53d6\u6309\u8d44\u6e90\u7ec4\u8ba1\u91cf\u7684\u6bcf\u65e5\u4f7f\u7528\u8d39\uff0c\u5e76\u5c06\u5176\u4fdd\u5b58\u5230\u672c\u5730\u6587\u4ef6\u4e2d\uff09\u6ce8\u518c\u5230Azure Functions\u5e76\u8fdb\u884c\u4e86\u6539\u9020\uff0c\u4f7f\u5176\u53ef\u4ee5\u81ea\u52a8\u6267\u884c\u5e76\u5c06\u6570\u636e\u4e0a\u4f20\u5230Azure Blob\u3002\u6211\u5e0c\u671b\u5c06\u4fdd\u5b58\u5728Blob\u4e2d\u7684\u6570\u636e\u4f5c\u4e3a\u4f7f\u7528Azure PaaS\u8fdb\u884c\u6570\u636e\u5206\u6790\u7684\u5176\u4e2d\u4e00\u4e2a\u6570\u636e\u6765\u6e90\u3002<\/p>\n<h3>\u6267\u884c\u73af\u5883<\/h3>\n<p>macOS Big Sur 11.1 : \u82f9\u679c\u64cd\u4f5c\u7cfb\u7edf\u5927\u9ea6\u82f9\u679c11.1\u7248<br \/>\npython 3.8.3 : Python 3.8.3 \u7248<br \/>\nAzure CLI 2.28.0 : Azure \u547d\u4ee4\u884c\u63a5\u53e32.28.0\u7248<br \/>\nAzure Functions Core Tools 3.0.3785 : Azure \u51fd\u6570\u6838\u5fc3\u5de5\u51773.0.3785\u7248<br \/>\nAzure Function Runtime Version: 3.2.0.0 : Azure \u51fd\u6570\u8fd0\u884c\u65f6\u7248\u672c3.2.0.0\u7248<\/p>\n<hr \/>\n<h2>\u4e8b\u524d\u7684\u51c6\u5907 (sh\u00ec de<\/h2>\n<h3>\u6ce8\u518c\u5b58\u50a8\u8d26\u6237<\/h3>\n<pre class=\"post-pre\"><code>## \u4f7f\u7528\u3059\u308b\u30c6\u30ca\u30f3\u30c8\u306eAzure\u74b0\u5883\u3078\u306e\u30ed\u30b0\u30a4\u30f3\r\n$ az login --tenant &lt;tenant_id&gt;\r\n\r\n## \u4f7f\u7528\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u3092\u5b9a\u7fa9\u3057\u307e\u3059\r\n$ az account set --subscription '&lt;Subscription\u540d&gt;'\r\n\r\n## \u30ea\u30bd\u30fc\u30b9\u30b0\u30eb\u30fc\u30d7\u306e\u4f5c\u6210\r\n$ az group create --resource-group &lt;ResourceGroup\u540d&gt; --location japaneast\r\n\r\n## \u30b9\u30c8\u30ec\u30fc\u30b8\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u4f5c\u6210\r\n$ az storage account create --name &lt;StorageAccount\u540d&gt; --resource-group &lt;ResourceGroup\u540d&gt; --location japaneast --sku Standard_LRS\r\n\r\n## \u30b3\u30f3\u30c6\u30ca\u306e\u4f5c\u6210\r\n$ az storage container create --name usage-summary-data\r\n<\/code><\/pre>\n<h3>\u521b\u5efa\u7528\u4e8e\u6267\u884c\u7a0b\u5e8f\u7684 ServicePrincipal<\/h3>\n<p>\u6839\u636e\u6b64\u6587\u7ae0\uff0cServicePrincipal\u7684\u5ba2\u6237\u7aef\u5bc6\u94a5\u9ed8\u8ba4\u6709\u6548\u671f\u4e3a1\u5e74\uff0c\u6700\u5927\u53ef\u8bbe\u7f6e\u4e3a2\u5e74\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7Azure CLI\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u521b\u5efa\u4e00\u4e2a\u6709\u6548\u671f\u4e3a29\u5e74\u7684ServicePrincipal\uff08\u76ee\u524d\u5df2\u6210\u529f\u521b\u5efa\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>## \u6700\u521d\u306f\uff12\u5e74\u3067\u4f5c\u6210\u3057\u307e\u3059\uff08\u30ed\u30fc\u30eb\u5272\u5f53\u306a\u3057\u3067\uff09\r\n$ az ad sp create-for-rbac --name sp_usagecostmanage --skip-assignment --years 2\r\n\r\n## \u4f5c\u6210\u3055\u308c\u305f\u5185\u5bb9\u3092\u53d6\u5f97\u3067\u304d\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\uff08\u3044\u304d\u306a\u308a29\u5e74\u3067\u4f5c\u6210\u3057\u305f\u5834\u5408\u3001\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3001\u3001\u3001\uff09\r\n$ az ad sp list --display-name sp_usagecostmanage\r\n\r\n## \u305d\u306e\u5f8c\u300129\u5e74\u3067\u518d\u4f5c\u6210\u3057\u307e\u3059\uff08\u30ed\u30fc\u30eb\u5272\u5f53\u306a\u3057\u3067\uff09\r\n$ az ad sp create-for-rbac --name sp_usagecostmanage --skip-assignment --years 29\r\n{\r\n  \"appId\": \"xxxxxxxx-xxxx-5757-4774-xxxxxxxxxxxx\",      --&gt; \u95a2\u6570\u30a2\u30d7\u30ea\u306e\u69cb\u6210\u3067 AZURE_CLIENT_ID \u3068\u3057\u3066\u767b\u9332\r\n  \"displayName\": \"sp_usagecostmanage\",\r\n  \"name\": \"xxxxxxxx-xxxx-5757-4774-xxxxxxxxxxxx\",\r\n  \"password\": \"hogehogehogehogehogehogehogehogege\",     --&gt; \u95a2\u6570\u30a2\u30d7\u30ea\u306e\u69cb\u6210\u3067 AZURE_CLIENT_SECRET \u3068\u3057\u3066\u767b\u9332\r\n  \"tenant\": \"zzzzzzzz-cccc-4645-5757-zzzzzzzzzzzz\"      --&gt; \u95a2\u6570\u30a2\u30d7\u30ea\u306e\u69cb\u6210\u3067 AZURE_TENANT_ID \u3068\u3057\u3066\u767b\u9332\r\n}\r\n\r\n## \u5fc5\u8981\u306a\u30b9\u30b3\u30fc\u30d7\u306b\u5fc5\u8981\u306a\u30ed\u30fc\u30eb\u3092\u5272\u308a\u4e0e\u3048\u307e\u3059\r\n$ APP_ID=$(az ad sp list --display-name sp_usagecostmanage --query '[].{ID:appId}' --output tsv)\r\n\r\n### \u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\u306e\u305f\u3081\u306b\u3001\u30b9\u30b3\u30fc\u30d7\uff1acontainers\u3000\u30ed\u30fc\u30eb\uff1aContributor \u3068\u3057\u307e\u3059\r\n$ az role assignment create \\\r\n    --assignee $APP_ID \\\r\n    --role \"Storage Blob Data Contributor\" \\\r\n    --scope \/subscriptions\/&lt;Subscription-ID&gt;\/resourceGroups\/&lt;ResouceGroup\u540d&gt;\/providers\/Microsoft.Storage\/storageAccounts\/&lt;StorageAccount\u540d&gt;\/blobServices\/default\/containers\/usage-summary-data\r\n\r\n### \u8907\u6570Subscription\u306e\u5229\u7528\u6599\u91d1\u53d6\u5f97\u306e\u305f\u3081\u3001\u30b9\u30b3\u30fc\u30d7\uff1aSubscription\u3000\u30ed\u30fc\u30eb\uff1aReader \u3068\u3057\u307e\u3059\r\n$ az role assignment create --assignee $APP_ID --scope \/subscriptions\/&lt;xxx-SubscriptionID&gt; --role Reader\r\n$ az role assignment create --assignee $APP_ID --scope \/subscriptions\/&lt;yyy-SubscriptionID&gt; --role Reader\r\n$ az role assignment create --assignee $APP_ID --scope \/subscriptions\/&lt;zzz-SubscriptionID&gt; --role Reader\r\n\r\n<\/code><\/pre>\n<h3>\u521b\u5efa\u51fd\u6570\u5e94\u7528\u7a0b\u5e8f<\/h3>\n<pre class=\"post-pre\"><code>## Function\u30a2\u30d7\u30ea\u306e\u4f5c\u6210\r\naz functionapp create -g &lt;ResourceGroup\u540d&gt; -n func-CostToBlob -s &lt;StorageAccount\u540d&gt; --runtime python --runtime-version 3.7 --consumption-plan-location japaneast --os-type Linux --functions-version 2\r\n\r\n## \u4f5c\u6210\u3057\u305f\u95a2\u6570\u30a2\u30d7\u30ea\u306e\u69cb\u6210\u8a2d\u5b9a\r\n### \u95a2\u6570\u30a2\u30d7\u30ea\u5b9f\u884c\u306e\u305f\u3081\u306e ServicePrincipal \u60c5\u5831\u306e\u5b9a\u7fa9\r\naz functionapp config appsettings set -n func-CostToBlob -g &lt;ResourceGroup\u540d&gt; \\\r\n    --settings \"AZURE_TENANT_ID=zzzzzzzz-cccc-4645-5757-zzzzzzzzzzzz\"\r\naz functionapp config appsettings set -n func-CostToBlob -g &lt;ResourceGroup\u540d&gt; \\\r\n    --settings \"AZURE_CLIENT_ID=xxxxxxxx-xxxx-5757-4774-xxxxxxxxxxxx\"\r\naz functionapp config appsettings set -n func-CostToBlob -g &lt;ResourceGroup\u540d&gt; \\\r\n    --settings \"AZURE_CLIENT_SECRET=hogehogehogehogehogehogehogehogege\"\r\n\r\n### \u5b9a\u7fa9\u60c5\u5831\u306e\u78ba\u8a8d\r\naz functionapp config appsettings list -n func-CostToBlob -g &lt;ResourceGroup\u540d&gt; -o table\r\n<\/code><\/pre>\n<h3>\u521b\u5efa\u672c\u5730\u73af\u5883\u4ee5\u7528\u4e8eFunctions\u3002<\/h3>\n<pre class=\"post-pre\"><code>## Function\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u4f5c\u6210\r\n(base)$ mkdir Functions\r\n(base)$ cd Functions\r\n\r\n## \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u7528\u306ePython\u4eee\u60f3\u74b0\u5883\u306e\u69cb\u7bc9\r\n(base)$ python -m venv .venv\r\n(base)$ source .venv\/bin\/activate\r\n(.venv) (base)$ python --version\r\nPython 3.8.3\r\n\r\n## Function\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\r\n(.venv) (base)$ func init CostToBlob --python\r\nFound Python version 3.8.3 (python3).\r\nWriting requirements.txt\r\nWriting .funcignore\r\nWriting getting_started.md\r\nWriting .gitignore\r\nWriting host.json\r\nWriting local.settings.json\r\nWriting \/Users\/ituru\/MyDevelops\/AzureCostManagement\/Functions\/CostToBlob\/.vscode\/extensions.json\r\n\r\n## Function\u306e\u4f5c\u6210\r\n(.venv) (base)$ cd CostToBlob\r\n(.venv) (base)$ func new                           \r\nSelect a number for template:\r\n1. Azure Blob Storage trigger\r\n2. Azure Cosmos DB trigger\r\n3. Durable Functions activity\r\n4. Durable Functions entity\r\n5. Durable Functions HTTP starter\r\n6. Durable Functions orchestrator\r\n7. Azure Event Grid trigger\r\n8. Azure Event Hub trigger\r\n9. HTTP trigger\r\n10. Kafka output\r\n11. Kafka trigger\r\n12. Azure Queue Storage trigger\r\n13. RabbitMQ trigger\r\n14. Azure Service Bus Queue trigger\r\n15. Azure Service Bus Topic trigger\r\n16. Timer trigger\r\nChoose option: 16\r\nTimer trigger\r\nFunction name: [TimerTrigger] CostToBlobMontly\r\nWriting \/Users\/ituru\/MyDevelops\/AzureCostManagement\/Functions\/CostToBlob\/CostToBlobMontly\/readme.md\r\nWriting \/Users\/ituru\/MyDevelops\/AzureCostManagement\/Functions\/CostToBlob\/CostToBlobMontly\/__init__.py\r\nWriting \/Users\/ituru\/MyDevelops\/AzureCostManagement\/Functions\/CostToBlob\/CostToBlobMontly\/function.json\r\nThe function \"CostToBlobMontly\" was created successfully from the \"Timer trigger\" template.\r\n\r\n## \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\u306e\u78ba\u8a8d\r\n(.venv) (base)$ tree -a      \r\n.\r\n\u251c\u2500\u2500 .funcignore\r\n\u251c\u2500\u2500 .gitignore\r\n\u251c\u2500\u2500 .vscode\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 extensions.json\r\n\u251c\u2500\u2500 CostToBlobMontly\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 function.json\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 readme.md\r\n\u251c\u2500\u2500 getting_started.md\r\n\u251c\u2500\u2500 host.json\r\n\u251c\u2500\u2500 local.settings.json\r\n\u2514\u2500\u2500 requirements.txt\r\n\r\n2 directories, 10 files\r\n<\/code><\/pre>\n<hr \/>\n<h2>\u5185\u8535\u3055\u308c\u305fPython\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u6267\u884c<\/h2>\n<h3>\u6267\u884c\u7a0b\u5e8f<\/h3>\n<pre class=\"post-pre\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">logging<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">time<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">json<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">azure.functions<\/span> <span class=\"k\">as<\/span> <span class=\"n\">func<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">azure.identity<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">DefaultAzureCredential<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">azure.mgmt.resource<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">SubscriptionClient<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">azure.mgmt.costmanagement<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">CostManagementClient<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">azure.storage.blob<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">BlobServiceClient<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">datetime<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">datetime<\/span><span class=\"p\">,<\/span> <span class=\"n\">timezone<\/span><span class=\"p\">,<\/span> <span class=\"n\">timedelta<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">pandas<\/span> <span class=\"k\">as<\/span> <span class=\"n\">pd<\/span>\r\n\r\n<span class=\"n\">CONTAINER_NAME<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'usage-summary-data'<\/span>\r\n\r\n\r\n<span class=\"c1\"># \u63a5\u7d9a\u3057\u3066\u3044\u308b\u30c6\u30ca\u30f3\u30c8\u306e\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u3092\u64cd\u4f5c\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\r\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">GetSubscriptionObject<\/span><span class=\"p\">():<\/span>\r\n    <span class=\"n\">subscription_client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">SubscriptionClient<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"n\">credential<\/span><span class=\"o\">=<\/span><span class=\"n\">DefaultAzureCredential<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"p\">)<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">subscription_client<\/span>\r\n\r\n\r\n<span class=\"c1\"># CostManagement\u60c5\u5831 \u3092\u64cd\u4f5c\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\r\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">GetCostManagementObject<\/span><span class=\"p\">():<\/span>\r\n    <span class=\"n\">costmgmt_client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">CostManagementClient<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"n\">credential<\/span><span class=\"o\">=<\/span><span class=\"n\">DefaultAzureCredential<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"p\">)<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">costmgmt_client<\/span>\r\n\r\n\r\n<span class=\"c1\"># Blob\u3092\u64cd\u4f5c\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\r\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">GetBlobServiceObject<\/span><span class=\"p\">():<\/span>\r\n    <span class=\"n\">blob_service_client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">BlobServiceClient<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"n\">account_url<\/span><span class=\"o\">=<\/span><span class=\"s\">\"https:\/\/usagecostmanage.blob.core.windows.net\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">credential<\/span><span class=\"o\">=<\/span><span class=\"n\">DefaultAzureCredential<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"p\">)<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">blob_service_client<\/span>\r\n\r\n\r\n<span class=\"c1\"># Container\u3092\u64cd\u4f5c\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\r\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">GetContainerObject<\/span><span class=\"p\">(<\/span><span class=\"n\">blob_service_client<\/span><span class=\"p\">):<\/span>    \r\n    <span class=\"n\">container_client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">blob_service_client<\/span><span class=\"p\">.<\/span><span class=\"n\">get_container_client<\/span><span class=\"p\">(<\/span><span class=\"n\">CONTAINER_NAME<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">container_client<\/span>\r\n\r\n\r\n<span class=\"c1\"># \u6307\u5b9a\u3057\u305f Subscription \u306b\u3064\u3044\u3066 CostManagement \u304b\u3089\u30b3\u30b9\u30c8\u3092\u53d6\u5f97\r\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">GetCostManagement<\/span><span class=\"p\">(<\/span><span class=\"n\">costmgmt_client<\/span><span class=\"p\">,<\/span> <span class=\"n\">subs_id<\/span><span class=\"p\">):<\/span>\r\n\r\n    <span class=\"c1\"># Query costmanagement\uff08\u5148\u6708\u306e\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\uff09\r\n<\/span>    <span class=\"n\">SCOPE<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'\/subscriptions\/{}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">subs_id<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">costmanagement<\/span> <span class=\"o\">=<\/span> <span class=\"n\">costmgmt_client<\/span><span class=\"p\">.<\/span><span class=\"n\">query<\/span><span class=\"p\">.<\/span><span class=\"n\">usage<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"n\">SCOPE<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"p\">{<\/span>\r\n            <span class=\"s\">\"type\"<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Usage\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"s\">\"timeframe\"<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"TheLastMonth\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"s\">\"dataset\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"s\">\"granularity\"<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Daily\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">\"aggregation\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n                    <span class=\"s\">\"totalCost\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n                        <span class=\"s\">\"name\"<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"PreTaxCost\"<\/span><span class=\"p\">,<\/span>\r\n                        <span class=\"s\">\"function\"<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Sum\"<\/span>\r\n                    <span class=\"p\">}<\/span>\r\n                <span class=\"p\">},<\/span>\r\n                <span class=\"s\">\"grouping\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n                    <span class=\"p\">{<\/span>\r\n                        <span class=\"s\">\"type\"<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Dimension\"<\/span><span class=\"p\">,<\/span>\r\n                        <span class=\"s\">\"name\"<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"ResourceGroup\"<\/span>\r\n                    <span class=\"p\">}<\/span>\r\n                <span class=\"p\">]<\/span>\r\n            <span class=\"p\">}<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">)<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">costmanagement<\/span>\r\n\r\n\r\n<span class=\"c1\"># \u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3ID\u3092\u6307\u5b9a\u3057\u30ea\u30bd\u30fc\u30b9\u30b0\u30eb\u30fc\u30d7\u6bce\u306b CostManagement\u60c5\u5831\u3092\u53d6\u5f97\r\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">GetSubscriptionCsotManagement<\/span><span class=\"p\">():<\/span>\r\n\r\n    <span class=\"c1\"># \u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u3092\u64cd\u4f5c\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u53d6\u5f97\r\n<\/span>    <span class=\"n\">subscription_list<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GetSubscriptionObject<\/span><span class=\"p\">()<\/span>    \r\n\r\n    <span class=\"c1\"># CostManagement\u3092\u64cd\u4f5c\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u53d6\u5f97\r\n<\/span>    <span class=\"n\">costmgmt_client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GetCostManagementObject<\/span><span class=\"p\">()<\/span>\r\n\r\n    <span class=\"c1\"># Blob\u3092\u64cd\u4f5c\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\r\n<\/span>    <span class=\"n\">blob_service_client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GetBlobServiceObject<\/span><span class=\"p\">()<\/span>\r\n\r\n    <span class=\"c1\"># Container\u3092\u64cd\u4f5c\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\r\n<\/span>    <span class=\"n\">container_client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GetContainerObject<\/span><span class=\"p\">(<\/span><span class=\"n\">blob_service_client<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"c1\"># \u53d6\u5f97\u30b3\u30b9\u30c8\u306e \u30ad\u30fc\u3068\u5024\r\n<\/span>    <span class=\"n\">row_key<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">'UsageCost'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'Date'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'ResourceGroup'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'Currency'<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"n\">row_value<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[]<\/span>\r\n\r\n    <span class=\"c1\"># \u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u6bce\u306b CostManagement \u304b\u3089\u30b3\u30b9\u30c8\u3092\u53d6\u5f97\r\n<\/span>    <span class=\"k\">for<\/span> <span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">subs<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">subscription_list<\/span><span class=\"p\">.<\/span><span class=\"n\">subscriptions<\/span><span class=\"p\">.<\/span><span class=\"nb\">list<\/span><span class=\"p\">()):<\/span>\r\n\r\n        <span class=\"c1\"># \u6307\u5b9a\u306e\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u306e CostManagement \u304b\u3089\u30b3\u30b9\u30c8\u3092\u53d6\u5f97\r\n<\/span>        <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"s\">\"<\/span><span class=\"se\">\\n\\n<\/span><span class=\"s\"> ##### \u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3 \uff1a {} #####\"<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">subs<\/span><span class=\"p\">.<\/span><span class=\"n\">display_name<\/span><span class=\"p\">))<\/span>\r\n        <span class=\"n\">costmanagement<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GetCostManagement<\/span><span class=\"p\">(<\/span><span class=\"n\">costmgmt_client<\/span><span class=\"p\">,<\/span> <span class=\"n\">subs<\/span><span class=\"p\">.<\/span><span class=\"n\">subscription_id<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"c1\"># rows\u30ab\u30e9\u30e0\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u3001\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u306e\u30b3\u30b9\u30c8\u5408\u8a08\u5024\u306e\u53d6\u5f97\r\n<\/span>        <span class=\"n\">SubTotalCost<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">sum<\/span><span class=\"p\">(<\/span><span class=\"n\">cost<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"k\">for<\/span> <span class=\"n\">cost<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">costmanagement<\/span><span class=\"p\">.<\/span><span class=\"n\">rows<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"c1\"># \u305d\u306e\u5408\u8a08\u5024\u304c\u300c0\u300d\u306e\u5834\u5408\u3001\u6b21\u306e\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u3078\r\n<\/span>        <span class=\"k\">if<\/span> <span class=\"n\">SubTotalCost<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">:<\/span>\r\n            <span class=\"k\">continue<\/span>   \r\n\r\n        <span class=\"c1\"># \u53d6\u5f97\u3057\u305f\u30b3\u30b9\u30c8\u60c5\u5831\u3092\u65e5\u4ed8\u3067\u6607\u9806\u30bd\u30fc\u30c8\u3057\u3001\u8f9e\u66f8\u578b\u306b\u5909\u63db\u3059\u308b\r\n<\/span>        <span class=\"n\">row_value<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">sorted<\/span><span class=\"p\">(<\/span><span class=\"n\">costmanagement<\/span><span class=\"p\">.<\/span><span class=\"n\">rows<\/span><span class=\"p\">,<\/span> <span class=\"n\">key<\/span><span class=\"o\">=<\/span><span class=\"k\">lambda<\/span> <span class=\"n\">x<\/span><span class=\"p\">:<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span> <span class=\"n\">reverse<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">row_dict<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"nb\">dict<\/span><span class=\"p\">(<\/span><span class=\"nb\">zip<\/span><span class=\"p\">(<\/span><span class=\"n\">row_key<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span><span class=\"p\">))<\/span> <span class=\"k\">for<\/span> <span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">row_value<\/span><span class=\"p\">]<\/span>\r\n\r\n        <span class=\"c1\"># \u30ea\u30bd\u30fc\u30b9\u30b0\u30eb\u30fc\u30d7\u3067\u30bd\u30fc\u30c8\u3057\u3066\u3001\u3068\u308a\u3042\u3048\u305a\u30d5\u30a1\u30a4\u30eb\u306b\u4fdd\u5b58\u3057\u3066\u304a\u304f\r\n<\/span>        <span class=\"n\">rows<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">sorted<\/span><span class=\"p\">(<\/span><span class=\"n\">row_dict<\/span><span class=\"p\">,<\/span> <span class=\"n\">key<\/span><span class=\"o\">=<\/span><span class=\"k\">lambda<\/span> <span class=\"n\">x<\/span><span class=\"p\">:<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"s\">'ResourceGroup'<\/span><span class=\"p\">],<\/span> <span class=\"n\">reverse<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">UsageDataToBlobContainer<\/span><span class=\"p\">(<\/span><span class=\"n\">rows<\/span><span class=\"p\">,<\/span> <span class=\"n\">subs<\/span><span class=\"p\">.<\/span><span class=\"n\">display_name<\/span><span class=\"p\">,<\/span> <span class=\"n\">blob_service_client<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"c1\"># break\r\n<\/span>\r\n    <span class=\"c1\"># \u30b3\u30f3\u30c6\u30ca\u4e00\u89a7\u306e\u53d6\u5f97\r\n<\/span>    <span class=\"n\">BlobList<\/span><span class=\"p\">(<\/span><span class=\"n\">container_client<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"c1\"># \u30af\u30ed\u30fc\u30ba\u51e6\u7406\r\n<\/span>    <span class=\"n\">costmgmt_client<\/span><span class=\"p\">.<\/span><span class=\"n\">close<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"n\">subscription_list<\/span><span class=\"p\">.<\/span><span class=\"n\">close<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"n\">container_client<\/span><span class=\"p\">.<\/span><span class=\"n\">close<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"n\">blob_service_client<\/span><span class=\"p\">.<\/span><span class=\"n\">close<\/span><span class=\"p\">()<\/span>\r\n\r\n\r\n<span class=\"c1\"># \u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u6bce\u306b CostManagement\u60c5\u5831\u3092\u53d6\u5f97\r\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">UsageDataToBlobContainer<\/span><span class=\"p\">(<\/span><span class=\"n\">rows<\/span><span class=\"p\">,<\/span> <span class=\"n\">subname<\/span><span class=\"p\">,<\/span> <span class=\"n\">blob_service_client<\/span><span class=\"p\">):<\/span>\r\n\r\n    <span class=\"c1\"># \u30c7\u30fc\u30bf\u3092 DataFrame\u5316\u3057\u3001\u4e0d\u5fc5\u8981\u9805\u76ee(Currency)\u306e\u524a\u9664\u3068\u5fc5\u8981\u9805\u76ee(Subscription)\u306e\u8ffd\u52a0\r\n<\/span>    <span class=\"n\">dfl<\/span><span class=\"o\">=<\/span><span class=\"n\">pd<\/span><span class=\"p\">.<\/span><span class=\"n\">DataFrame<\/span><span class=\"p\">(<\/span><span class=\"n\">rows<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">dfl<\/span><span class=\"p\">.<\/span><span class=\"n\">drop<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Currency\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">axis<\/span><span class=\"o\">=<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"n\">inplace<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">dfl<\/span><span class=\"p\">[<\/span><span class=\"s\">'Subscription'<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">subname<\/span>\r\n\r\n    <span class=\"c1\"># json\u5f62\u5f0f\u3078\u306e\u5909\u63db\r\n<\/span>    <span class=\"n\">rowl_key<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">'UsageCost'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'Date'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'ResourceGroup'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'Subscription'<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"n\">rowl_dict<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"nb\">dict<\/span><span class=\"p\">(<\/span><span class=\"nb\">zip<\/span><span class=\"p\">(<\/span><span class=\"n\">rowl_key<\/span><span class=\"p\">,<\/span><span class=\"n\">item<\/span><span class=\"p\">))<\/span> <span class=\"k\">for<\/span> <span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">dfl<\/span><span class=\"p\">.<\/span><span class=\"n\">values<\/span><span class=\"p\">]<\/span>\r\n\r\n    <span class=\"c1\"># \u4fdd\u5b58\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u540d\u306e\u751f\u6210\r\n<\/span>    <span class=\"n\">now<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"n\">now<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"c1\"># blob_name = '.\/output\/UsageCost_' + subname + '_' + now.strftime('%Y%m%d_%H%M%S') + '.json'\r\n<\/span>    <span class=\"n\">blob_name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">now<\/span><span class=\"p\">.<\/span><span class=\"n\">strftime<\/span><span class=\"p\">(<\/span><span class=\"s\">'%Y%m%d_%H%M%S'<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"s\">'_'<\/span> <span class=\"o\">+<\/span> <span class=\"n\">subname<\/span> <span class=\"o\">+<\/span> <span class=\"s\">'.json'<\/span>\r\n\r\n    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>        \r\n        <span class=\"c1\"># Create a blob client using the blob_name as the name for the blob\r\n<\/span>        <span class=\"n\">blob_client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">blob_service_client<\/span><span class=\"p\">.<\/span><span class=\"n\">get_blob_client<\/span><span class=\"p\">(<\/span><span class=\"n\">container<\/span><span class=\"o\">=<\/span><span class=\"n\">CONTAINER_NAME<\/span><span class=\"p\">,<\/span> <span class=\"n\">blob<\/span><span class=\"o\">=<\/span><span class=\"n\">blob_name<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"c1\"># Blob Upload\r\n<\/span>        <span class=\"n\">blob_client<\/span><span class=\"p\">.<\/span><span class=\"n\">upload_blob<\/span><span class=\"p\">(<\/span><span class=\"n\">json<\/span><span class=\"p\">.<\/span><span class=\"n\">dumps<\/span><span class=\"p\">(<\/span><span class=\"n\">rowl_dict<\/span><span class=\"p\">))<\/span>\r\n\r\n    <span class=\"k\">except<\/span> <span class=\"nb\">Exception<\/span> <span class=\"k\">as<\/span> <span class=\"n\">ex<\/span><span class=\"p\">:<\/span>\r\n        <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"s\">'Exception:'<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"n\">ex<\/span><span class=\"p\">)<\/span>\r\n\r\n\r\n<span class=\"c1\"># Blob\u4e00\u89a7\u306e\u53d6\u5f97\r\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">BlobList<\/span><span class=\"p\">(<\/span><span class=\"n\">container_client<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"s\">\"<\/span><span class=\"se\">\\n\\n<\/span><span class=\"s\"> \uff1d\uff1d\uff1d Blob \u4e00\u89a7\u306e\u8868\u793a \uff1d\uff1d\uff1d\"<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>        \r\n        <span class=\"c1\"># List the blobs in the container\r\n<\/span>        <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"s\">\"<\/span><span class=\"se\">\\n<\/span><span class=\"s\">Listing blobs...\"<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">blob_list<\/span> <span class=\"o\">=<\/span> <span class=\"n\">container_client<\/span><span class=\"p\">.<\/span><span class=\"n\">list_blobs<\/span><span class=\"p\">()<\/span>\r\n        <span class=\"k\">for<\/span> <span class=\"n\">blob<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">blob_list<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"s\">\"<\/span><span class=\"se\">\\t<\/span><span class=\"s\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">blob<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"k\">except<\/span> <span class=\"nb\">Exception<\/span> <span class=\"k\">as<\/span> <span class=\"n\">ex<\/span><span class=\"p\">:<\/span>\r\n        <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"s\">'Exception:'<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"n\">ex<\/span><span class=\"p\">)<\/span>\r\n\r\n\r\n<span class=\"k\">def<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">mytimer<\/span><span class=\"p\">:<\/span> <span class=\"n\">func<\/span><span class=\"p\">.<\/span><span class=\"n\">TimerRequest<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"bp\">None<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"c1\"># \u65e5\u672c\u6642\u9593\u306e\u53d6\u5f97\r\n<\/span>    <span class=\"n\">JST<\/span> <span class=\"o\">=<\/span> <span class=\"n\">timezone<\/span><span class=\"p\">(<\/span><span class=\"n\">timedelta<\/span><span class=\"p\">(<\/span><span class=\"n\">hours<\/span><span class=\"o\">=+<\/span><span class=\"mi\">9<\/span><span class=\"p\">),<\/span> <span class=\"s\">'JST'<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">today<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"n\">now<\/span><span class=\"p\">(<\/span><span class=\"n\">JST<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"k\">if<\/span> <span class=\"n\">mytimer<\/span><span class=\"p\">.<\/span><span class=\"n\">past_due<\/span><span class=\"p\">:<\/span>\r\n        <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"s\">'\u25a0 \u25a0 \u25a0 The timer is past due! \u25a0 \u25a0 \u25a0'<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"s\">'\u25a0 \u25a0 \u25a0 Python timer trigger function (func-CostToBlob) ran at %s \u25a0 \u25a0 \u25a0'<\/span><span class=\"p\">,<\/span> <span class=\"n\">today<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"n\">start<\/span> <span class=\"o\">=<\/span> <span class=\"n\">time<\/span><span class=\"p\">.<\/span><span class=\"n\">time<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"n\">GetSubscriptionCsotManagement<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"n\">generate_time<\/span> <span class=\"o\">=<\/span> <span class=\"n\">time<\/span><span class=\"p\">.<\/span><span class=\"n\">time<\/span><span class=\"p\">()<\/span> <span class=\"o\">-<\/span> <span class=\"n\">start<\/span>\r\n\r\n    <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\u51e6\u7406\u6642\u9593:{0}\"<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">generate_time<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" [sec]\"<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<h3>\u5b9a\u4e49\u6240\u9700\u7684Python\u8f6f\u4ef6\u5305\u6765\u6267\u884c\u3002<\/h3>\n<pre class=\"post-pre\"><code>azure-functions\r\nazure-identity\r\nazure-mgmt-resource\r\nazure-mgmt-costmanagement\r\nazure-storage-blob\r\ntabulate\r\nrequests\r\npandas\r\n<\/code><\/pre>\n<h3>\u8bbe\u5b9a\u6267\u884c\u8ba1\u5212\uff08\u5b9a\u65f6\u89e6\u53d1\u5668\uff09<\/h3>\n<p>\u6bcf\u4e2a\u6708\u7684\u7b2c7\u53f714:20:00\uff08JST\uff09\uff08\u6bcf\u4e2a\u6708\u7684\u7b2c7\u53f75:20:00\uff08UTC\uff09\uff09\u6267\u884c<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"nl\">\"scriptFile\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"__init__.py\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"bindings\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"p\">{<\/span>\r\n      <span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"mytimer\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"nl\">\"type\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"timerTrigger\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"nl\">\"direction\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"in\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"nl\">\"schedule\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"0 20 5 7 * *\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<h2>\u5728\u672c\u5730\u73af\u5883\u4e2d\u6d4b\u8bd5 Azure Functions<\/h2>\n<h3>\u6267\u884c\u7a0b\u5e8f<\/h3>\n<pre class=\"post-pre\"><code>## Python\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\r\n(.venv) (base)$ pip install -r requirements.txt\r\n\r\n##  Azure Functions \u69cb\u6210\u60c5\u5831\u306e\u30ed\u30fc\u30ab\u30eb\u306b\u8a2d\u5b9a\r\n(.venv) (base)$ func azure functionapp fetch-app-settings func-CostToBlob\r\nApp Settings:\r\nLoading FUNCTIONS_WORKER_RUNTIME = *****\r\nLoading FUNCTIONS_EXTENSION_VERSION = *****\r\nLoading AzureWebJobsStorage = *****\r\nLoading WEBSITE_CONTENTAZUREFILECONNECTIONSTRING = *****\r\nLoading WEBSITE_CONTENTSHARE = *****\r\nLoading APPINSIGHTS_INSTRUMENTATIONKEY = *****\r\nLoading AZURE_TENANT_ID = *****\r\nLoading AZURE_CLIENT_ID = *****\r\nLoading AZURE_CLIENT_SECRET = *****\r\n\r\nConnection Strings:\r\n\r\n## \u30ed\u30fc\u30ab\u30eb\u74b0\u5883\u3067\u306e\u5b9f\u884c\r\n(.venv) (base)$ source ..\/.venv\/bin\/activate\r\n(.venv) (base)$ func start --verbose\r\nFound Python version 3.8.3 (python3).\r\n\r\n                  %%%%%%\r\n                 %%%%%%\r\n            @   %%%%%%    @\r\n          @@   %%%%%%      @@\r\n       @@@    %%%%%%%%%%%    @@@\r\n     @@      %%%%%%%%%%        @@\r\n       @@         %%%%       @@\r\n         @@      %%%       @@\r\n           @@    %%      @@\r\n                %%\r\n                %\r\n\r\n\r\nAzure Functions Core Tools\r\nCore Tools Version:       3.0.3785 Commit hash: db6fe71b2f05d09757179d5618a07bba4b28826f  (64-bit)\r\nFunction Runtime Version: 3.2.0.0\r\n         :\r\n        \u7701\u7565\r\n         :\r\n[2021-10-02T03:48:00.398Z] Host started (526ms)\r\n[2021-10-02T03:48:00.398Z] Job host started\r\n[2021-10-02T03:48:04.946Z] Host lock lease acquired by instance ID '000000000000000000000000DDDDDDDD'.\r\n         :\r\n        \u7701\u7565\r\n         :\r\n<\/code><\/pre>\n<hr \/>\n<h2>\u5c06\u90e8\u7f72\u81f3Azure<\/h2>\n<h3>\u6267\u884c\u90e8\u7f72<\/h3>\n<pre class=\"post-pre\"><code>## Python\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\r\n(.venv) (base)$ func azure functionapp publish func-CostToBlob\r\nUploading 7.67 KB [###############################################################################]\r\nRemote build in progress, please wait...\r\n         :\r\n        \u7701\u7565\r\n         :\r\nUploading built content \/home\/site\/artifacts\/functionappartifact.squashfs for linux consumption function app...\r\nResetting all workers for func-costtoblob.azurewebsites.net\r\nDeployment successful.\r\nRemote build succeeded!\r\nSyncing triggers...\r\nFunctions in func-CostToBlob:\r\n    CostToBlobMontly - [timerTrigger]\r\n<\/code><\/pre>\n<p>\u5728\u65f6\u95f4\u5230\u8fbe\u540e\uff0c\u5c06\u6309\u65e5\u5bf9\u6bcf\u4e2a\u8d44\u6e90\u7ec4\u8fdb\u884c\u6c47\u603b\u7684 Azure \u4f7f\u7528\u8d39\u7528\u6309\u8ba2\u9605\u8fdb\u884c\u5f52\u6863\uff0c\u5e76\u4e0a\u4f20\u5230\u6307\u5b9a\u7684 Azure Blob \u5bb9\u5668\u3002<\/p>\n<hr \/>\n<h3>\u603b\u7ed3<\/h3>\n<p>\u5728\u4f7f\u7528Azure Functions\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u9047\u5230\u4e86\u5f88\u591a\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u6210\u529f\u5730\u8ba9\u6211\u81ea\u5df1\u7f16\u5199\u7684Python\u7a0b\u5e8f\u5728\u5176\u4e0a\u8fd0\u884c\u3002\u4f7f\u7528Azure Function\u786e\u5b9e\u9700\u8981\u82b1\u8d39\u4e00\u4e9b\u529f\u592b\uff0c\u6211\u5e0c\u671b\u5b83\u80fd\u50cfAWS\u4e00\u6837\u66f4\u52a0\u65b9\u4fbf\u5feb\u6377\u3002<\/p>\n<h3>\u8bf7\u60a8\u53c2\u8003\u4ee5\u4e0b\u7684\u6587\u7ae0\u3002<\/h3>\n<p>\u6211\u53c2\u8003\u4e86\u4ee5\u4e0b\u7684\u6587\u7ae0\u3002\u975e\u5e38\u611f\u8c22\u3002<br \/>\n\u5b89\u88c5\u548c\u914d\u7f6eMac\u4e0a\u7684Python3\u3010\u6700\u7ec8\u7248\u3011<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u8981\u6982\u8ff0 \u6211\u5c06\u8fd9\u4e2a\u7a0b\u5e8f\uff08\u4f7f\u7528Python\u4eceAzure\u83b7\u53d6\u6309\u8d44\u6e90\u7ec4\u8ba1\u91cf\u7684\u6bcf\u65e5\u4f7f\u7528\u8d39\uff0c\u5e76\u5c06\u5176\u4fdd\u5b58\u5230\u672c\u5730\u6587\u4ef6\u4e2d\uff09\u6ce8\u518c [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-47365","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u6211\u628a Azure \u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230 Azure Blob \u4e2d\u8bd5\u8bd5\u770b - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u628a-azure-\u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230-azure-blob-\u4e2d\u8bd5\u8bd5\u770b\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u6211\u628a Azure \u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230 Azure Blob \u4e2d\u8bd5\u8bd5\u770b\" \/>\n<meta property=\"og:description\" content=\"\u7b80\u8981\u6982\u8ff0 \u6211\u5c06\u8fd9\u4e2a\u7a0b\u5e8f\uff08\u4f7f\u7528Python\u4eceAzure\u83b7\u53d6\u6309\u8d44\u6e90\u7ec4\u8ba1\u91cf\u7684\u6bcf\u65e5\u4f7f\u7528\u8d39\uff0c\u5e76\u5c06\u5176\u4fdd\u5b58\u5230\u672c\u5730\u6587\u4ef6\u4e2d\uff09\u6ce8\u518c [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u628a-azure-\u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230-azure-blob-\u4e2d\u8bd5\u8bd5\u770b\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-30T22:10:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T02:31:08+00:00\" \/>\n<meta name=\"author\" content=\"\u9038, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u9038, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/\",\"name\":\"\u6211\u628a Azure \u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230 Azure Blob \u4e2d\u8bd5\u8bd5\u770b - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-09-30T22:10:31+00:00\",\"dateModified\":\"2024-05-04T02:31:08+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u6211\u628a Azure \u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230 Azure Blob \u4e2d\u8bd5\u8bd5\u770b\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\",\"name\":\"\u9038, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"caption\":\"\u9038, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u6211\u628a Azure \u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230 Azure Blob \u4e2d\u8bd5\u8bd5\u770b - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u628a-azure-\u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230-azure-blob-\u4e2d\u8bd5\u8bd5\u770b\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u6211\u628a Azure \u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230 Azure Blob \u4e2d\u8bd5\u8bd5\u770b","og_description":"\u7b80\u8981\u6982\u8ff0 \u6211\u5c06\u8fd9\u4e2a\u7a0b\u5e8f\uff08\u4f7f\u7528Python\u4eceAzure\u83b7\u53d6\u6309\u8d44\u6e90\u7ec4\u8ba1\u91cf\u7684\u6bcf\u65e5\u4f7f\u7528\u8d39\uff0c\u5e76\u5c06\u5176\u4fdd\u5b58\u5230\u672c\u5730\u6587\u4ef6\u4e2d\uff09\u6ce8\u518c [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u628a-azure-\u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230-azure-blob-\u4e2d\u8bd5\u8bd5\u770b\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-09-30T22:10:31+00:00","article_modified_time":"2024-05-04T02:31:08+00:00","author":"\u9038, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u9038, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/","name":"\u6211\u628a Azure \u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230 Azure Blob \u4e2d\u8bd5\u8bd5\u770b - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-09-30T22:10:31+00:00","dateModified":"2024-05-04T02:31:08+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u6211\u628a Azure \u4f7f\u7528\u8d39\u7528\u4fdd\u5b58\u5230 Azure Blob \u4e2d\u8bd5\u8bd5\u770b"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487","name":"\u9038, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","caption":"\u9038, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%8a%8a-azure-%e4%bd%bf%e7%94%a8%e8%b4%b9%e7%94%a8%e4%bf%9d%e5%ad%98%e5%88%b0-azure-blob-%e4%b8%ad%e8%af%95%e8%af%95%e7%9c%8b%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=47365"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47365\/revisions"}],"predecessor-version":[{"id":97791,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47365\/revisions\/97791"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=47365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=47365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=47365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}