#!/bin/bash # 全てのリソース名に付与する接頭文字 (Storageアカウント名などは世界でユニークな必要があるので他ユーザと被らないような名前を付ける) PREFIX=XXXXXXXXXXX # リージョン region=japaneast # リソースグループ名 resourceGroup=${PREFIX}ResourceGroup # App Service webappName=${PREFIX}SampleApp webappPlan=F1
1_resources.sh
#!/bin/bash source ./0_env.sh # リソースの作成 if [ "$1" == "--create" ]; then # リソースグループの作成 echo az group create az group create --name $resourceGroup --location $region # App Service のデプロイ cd appservice az webapp up --sku $webappPlan -n $webappName -l $region -g ${resourceGroup} cd ../ fi # リソースの削除 if [ "$1" == "--delete" ]; then az group delete --name $resourceGroup -y fi
appservice/app.py
from flask import Flask import json import datetime app = Flask(__name__) @app.route("/hello", methods=['GET', 'POST']) def hello(): message = f"This is Sample response! ({datetime.datetime.now()})" return json.dumps({'message': message}), 200, {'Content-Type': 'application/json; charset=utf-8'}
appservice/requirements.txt
Flask
Azure Active Directory → ユーザ からアクアセス確認用のユーザを作成しておく。
App Service から対象のアプリを選択後、[認証/承認] を選択して以下の通り設定。
test.go
package main import ( "bytes" "fmt" "io/ioutil" "net/http" "os" "time" "github.com/Azure/go-autorest/autorest/azure/auth" "github.com/Azure/go-autorest/autorest/adal" //"github.com/Azure/go-autorest/autorest/azure" ) const clientID string = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" const tenantID string = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" const username string = "xxxxxxxx@xxxxxxxx.onmicrosoft.com" const password string = "xxxxxxxxxx" //const resource string = "https://graph.microsoft.com/" //const resource string = "https://graph.windows.net/" //const resource string = "https://xxxxxxxxxx.azurewebsites.net" const resource string = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" const apiUrl string = "https://xxxxxxxxxx.azurewebsites.net/hello" func getToken() string { // トークンの取得 config := auth.NewUsernamePasswordConfig(username, password, clientID, tenantID) fmt.Printf("ClientID: : %v\n" , config.ClientID) fmt.Printf("Username : %v\n" , config.Username) fmt.Printf("Password : %v\n" , config.Username) fmt.Printf("TenantID : %v\n" , config.TenantID) fmt.Printf("AADEndpoint: %v\n" , config.AADEndpoint) fmt.Printf("Resource : %v\n" , config.Resource) config.Resource = resource //oauthConfig, err := adal.NewOAuthConfig(azure.PublicCloud.ActiveDirectoryEndpoint, tenantID) oauthConfig, err := adal.NewOAuthConfig(config.AADEndpoint, tenantID) if err != nil { fmt.Printf("NewOAuthConfig Error! %v\n", err) } spt, sptErr := adal.NewServicePrincipalTokenFromUsernamePassword(*oauthConfig, clientID, username, password, resource) //spt, sptErr := adal.NewServicePrincipalTokenFromUsernamePassword(*oauthConfig, clientID, username, password, config.Resource) if sptErr != nil { fmt.Printf("sptErr: %v\n", sptErr) } fmt.Printf("spt: %v\n", spt) err = spt.Refresh() if err != nil { fmt.Printf("Refresh Error: %v\n", err) } oAuthToken := spt.OAuthToken() token := spt.Token() fmt.Printf("oAuthToken: %v\n", oAuthToken) fmt.Printf("token: %v\n", token) fmt.Printf("token.AccessToken : %v\n", token.AccessToken) fmt.Printf("token.RefreshToken: %v\n", token.RefreshToken) fmt.Printf("token.ExpiresIn : %v\n", token.ExpiresIn) fmt.Printf("token.ExpiresOn : %v\n", token.ExpiresOn) fmt.Printf("token.NotBefore : %v\n", token.NotBefore) fmt.Printf("token.Resource : %v\n", token.Resource) fmt.Printf("token.Type : %v\n", token.Type) return token.AccessToken } func sendRequest() { token := getToken() fmt.Printf("--- token --- %s\n", token) client := &http.Client{} reqJson := "{\"param1\": \"abc\"}" req, _ := http.NewRequest("POST", apiUrl, bytes.NewBuffer([]byte(reqJson))) req.Header.Set("Content-Type" , "application/json") req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) resp, err := client.Do(req) if err != nil { fmt.Printf("### Error: %v\n", err) } defer resp.Body.Close() fmt.Printf("status : %d\n", resp.StatusCode) fmt.Printf("length : %d\n", resp.ContentLength) for k, v := range resp.Header { fmt.Printf("header %s = %v\n",k, v) } body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Printf("error: %T\n", err) } fmt.Printf("body: %v\n", string(body)) // 取得したデータをローカルにファイル出力 writeData(fmt.Sprintf("receive_data_%s", time.Now().Format("20060102_030405")), body) } func writeData(filename string, data []byte) error { file, err := os.Create(filename) if err != nil { return err } defer file.Close() _, err = file.Write(data) if err != nil { return err } return nil } func main() { sendRequest() }
go run test.go