跨賬戶資源和Amazon AppStream 2.0

來源: AWS
作者:Ali Othman
時間:2020-08-26
17442
在此文章中,我向您展示如何創(chuàng)建基本的多帳戶AppStream 2.0部署。我們將在一個AWS賬戶中創(chuàng)建一個AWS Lambda函數(shù),該函數(shù)從兩個AWS賬戶之一中的堆棧和隊列中生成一個AppStream 2.0流URL,具體取決于提交的電子郵件地址。

我們的一些使用Amazon AppStream 2.0的客戶利用多賬戶設置來分離其AppStream 2.0資源。對于這些客戶,他們選擇將AppStream 2.0資源分成多個帳戶的原因很多。但是,我們客戶這樣做的最常見原因是資源和賬單隔離以及增強的安全性。例如,每個業(yè)務部門,外部客戶或部署環(huán)境可能需要擁有自己的AWS賬戶,每個賬戶都具有自己的,唯一配置的AppStream 2.0環(huán)境。

在此博客文章中,我向您展示如何創(chuàng)建基本的多帳戶AppStream 2.0部署。我們將在一個AWS賬戶中創(chuàng)建一個AWS Lambda函數(shù),該函數(shù)從兩個AWS賬戶之一中的堆棧和隊列中生成一個AppStream 2.0流URL,具體取決于提交的電子郵件地址。

先決條件

·此博客中的三個AWS賬戶分別稱為賬戶A,賬戶B和賬戶C

·帳戶B和C中的AppStream 2.0堆棧和隊列

創(chuàng)建和配置帳戶B和C中的IAM角色角色

在帳戶B中,打開IAM控制臺。這應該是包含您的AppStream 2.0堆棧和隊列的帳戶。

打開IAM控制臺,然后依次選擇“策略”,“創(chuàng)建策略”。

選擇JSON標簽。將以下JSON策略復制并粘貼到策略文檔框中:

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": "appstream:CreateStreamingURL",

            "Resource": [

                "arn:aws:appstream:<region>:<Account_B-AWS-Account-ID>:fleet/<Fleet-Name>",

                "arn:aws:appstream:<region>:<Account_B-AWS-Account-ID>:stack/<Stack-Name>"

            ]

        }

    ]

}

·在JSON政策中,替換為:

  -占位符&lt;Account_B-AWS-Account-ID&gt;,具有賬戶B的AWS賬戶ID

  -AppStream 2.0隊列和堆棧的占位符&lt;Fleet-Name&gt;和&lt;Stack-Name&gt;

  -AppStream 2.0資源所在的占位符&lt;region&gt;。

·選擇審核政策。

·為您的策略命名,然后選擇創(chuàng)建策略。

·在導航窗格中,選擇Roles,Create Role,然后配置以下框:

  -對于“選擇受信任實體的類型”,選擇另一個AWS賬戶。

  -輸入賬戶A的AWS賬戶ID

·選擇下一步:權限。

·在“篩選器策略”搜索框中,搜索您先前創(chuàng)建的策略。當策略出現(xiàn)在列表中時,選中策略名稱旁邊的復選框。

·選擇下一步:標簽。盡管可以為策略指定標簽,但是標簽是可選的。

·選擇下一步:查看。為您的角色命名,然后選擇創(chuàng)建角色。

·在賬戶C中重復步驟1-9,使用AWS Region和AppStream 2.0堆棧以及賬戶C的Fleet ARN更新IAM策略

在帳戶A中創(chuàng)建和配置IAM角色

·在帳戶A中,打開IAM控制臺,這是包含Lambda函數(shù)的帳戶。

·打開IAM控制臺,然后依次選擇“策略”,“創(chuàng)建策略”。

選擇JSON標簽。將以下JSON策略復制并粘貼到策略文檔框中:

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "logs:CreateLogStream",

                "logs:CreateLogGroup",

                "logs:PutLogEvents"

            ],

            "Resource": "*"

        },

        {

            "Effect": "Allow",

            "Action": "sts:AssumeRole",

            "Resource": "arn:aws:iam::<Account_B-AWS-Account-ID>:role/<Role-Name>"

        },

        {

            "Effect": "Allow",

            "Action": "sts:AssumeRole",

            "Resource": "arn:aws:iam::<Account_C-AWS-Account-ID>:role/<Role-Name>"

        }

    ]

}

·使用您在帳戶B和C中創(chuàng)建的角色的ARN更新策略。

·創(chuàng)建策略后,在導航窗格中選擇Roles,Create Role,然后配置以下框:

  -對于“選擇可信實體的類型”,選擇“AWS服務”。

  -對于將使用此角色的服務,請選擇Lambda。

·選擇下一步:權限。

·在“篩選器策略”搜索框中,搜索您先前創(chuàng)建的策略。當策略出現(xiàn)在列表中時,選中策略名稱旁邊的復選框。

·選擇下一步:標簽。盡管可以為策略指定標簽,但是標簽是可選的。

·選擇下一步:查看。為您的角色命名,然后選擇創(chuàng)建角色。

在帳戶A中創(chuàng)建Lambda函數(shù)

·在帳戶A中,打開Lambda控制臺。

·選擇創(chuàng)建功能。

·在“創(chuàng)建功能”頁面上,從頭開始選擇“作者”。

·在“基本信息”下,執(zhí)行以下操作:

  -命名您的功能。

  -對于Runtime,選擇Node.js12.X。

·在“權限”下,選擇“選擇或創(chuàng)建執(zhí)行角色”旁邊的圖標。然后執(zhí)行以下操作:

  -對于執(zhí)行角色,選擇使用現(xiàn)有角色。

  -對于“現(xiàn)有角色”,選擇先前創(chuàng)建的Lambda執(zhí)行角色。

·選擇創(chuàng)建功能。

·在“功能代碼”部分中,將以下代碼復制并粘貼到選項卡上:

const AWS = require('aws-sdk');

const crypto = require('crypto');


const sts = new AWS.STS();


exports.handler = (event, context, callback) => {


    var eventdata = JSON.parse(event.body);

    var email = eventdata.email;


    if (email.includes("example.com")) { //replace with the domain you want to route to Account B's AS2 stack and fleet

        var sts_params = {

            RoleArn: "arn:aws:iam::<AWS-Account-ID-For-Account-B>:role/<Role-Name-From-Account-B>", //ARN from role created in Account B

            RoleSessionName: "<Any-String>", //Replace with any string

            DurationSeconds: 900

    

        };

        var as2region = "<Region>"; //Region where AS2 Stack and Fleet are located in Account B

        var as2stack = "<Stack-Name-From-Account-B>"; //Stack Name from account B

        var as2fleet = "<Fleet-Name-From-Account-B>"; //Fleet Name from account B

        

    }

    else if (email.includes("example-1.com")) { //replace with the domain you want to route to Account C's AS2 stack and fleet

        var sts_params = {

            RoleArn: "arn:aws:iam::<AWS-Account-ID-For-Account-C>:role/<Role-Name-From-Account-C>", //ARN from role created in Account C

            RoleSessionName: "<Any-String>", //Replace with any string

            DurationSeconds: 900

    

        };

        var as2region = "<Region>"; //Region where AS2 Stack and Fleet are located in Account C

        var as2stack = "<Stack-Name-From-Account-C>"; //Stack Name from account C

        var as2fleet = "<Fleet-Name-From-Account-C>"; //Fleet Name from account C

        

    }

    else{

        console.log("No matching domain. Email address is " + email);

        errorResponse('Email domain does not match!', context.awsRequestId, callback);

        process.exit(0)


    }


    sts.assumeRole(sts_params, function (err, data) {

        if (err) {

            console.log(err, err.stack);

            errorResponse('Error assuming role!', context.awsRequestId, callback);

        } else {

            console.log(data);


            var unlength = 16;

            var username = crypto.randomBytes(Math.ceil(unlength / 2)).toString('hex').slice(0, unlength);


            console.log("username: " + username);


            var as2_params = {

                FleetName: as2fleet,

                StackName: as2stack,

                UserId: username,

                Validity: 5

            };


            AWS.config.credentials = new AWS.TemporaryCredentials({ RoleArn: sts_params.RoleArn });

            AWS.config.update({ region: as2region }); 


            const appstream = new AWS.AppStream;


            var request = appstream.createStreamingURL(as2_params);

            request.

                on('success', function (response) {

                    console.log("Success! AS2 Streaming URL created.");

                    var output = response.data;

                    var url = output.StreamingURL;

                    callback(null, {

                        statusCode: 201,

                        body: JSON.stringify({

                            Message: url,

                            Reference: context.awsRequestId,

                        }),

                        headers: {

                            'Access-Control-Allow-Origin': '*',

                        },

                    });

                }).

                on('error', function (response) {

                    console.log("error: " + JSON.stringify(response.message));

                    errorResponse('Error creating AS2 streaming URL.', context.awsRequestId, callback);


                }).

                send();


        }

    });


};


function errorResponse(errorMessage, awsRequestId, callback) {

    callback(null, {

        statusCode: 500,

        body: JSON.stringify({

            Error: errorMessage,

            Reference: awsRequestId,

        }),

        headers: {

            'Access-Control-Allow-Origin': '*',

        },

    });

}

·替換所有占位符值。

·保存功能。

測試您的設置

·在帳戶A中,打開Lambda控制臺。

·選擇之前創(chuàng)建的Lambda函數(shù)

·在“選擇測試事件”下拉菜單中,選擇“配置測試事件”。

·在“配置測試事件”窗口中,使用以下設置配置事件:

  -活動模板應為“Hello World”

  -為活動命名

  -將JSON塊替換為以下內容:{"body":"{"email":"test example.com"}"}

  -將示例電子郵件地址替換為包含您要過濾的域之一的電子郵件地址

·創(chuàng)建活動

·創(chuàng)建事件后,選擇“測試”按鈕以開始測試

·如果測試成功,則應該返回一個AppStream 2.0流URL

·在網絡瀏覽器中復制并粘貼該URL以驗證其功能

·使用其他電子郵件域重新配置測試事件,然后重復測試過程

清理

·刪除您在帳戶A中創(chuàng)建的Lambda函數(shù)

·刪除您在帳戶A中創(chuàng)建的IAM角色

·刪除您在帳戶B和C中創(chuàng)建的IAM角色

·可選:刪除帳戶B和C中的AppStream 2.0堆棧和隊列

結論

就是這樣!現(xiàn)在,您具有AppStream 2.0的多帳戶設置。我們的ISV Workshop Series提供有關如何利用Amazon S3,API Gateway和Lambda創(chuàng)建AppStream 2.0流Web門戶的教程。您可能需要考慮使用新的Lambda功能修改其中一個研討會,以便您的用戶可以從此多帳戶部署中開始流式傳輸。

立即登錄,閱讀全文
版權說明:
本文內容來自于AWS,本站不擁有所有權,不承擔相關法律責任。文章內容系作者個人觀點,不代表快出海對觀點贊同或支持。如有侵權,請聯(lián)系管理員(zzx@kchuhai.com)刪除!
掃碼登錄
打開掃一掃, 關注公眾號后即可登錄/注冊
加載中
二維碼已失效 請重試
刷新
賬號登錄/注冊
個人VIP
小程序
快出海小程序
公眾號
快出海公眾號
商務合作
商務合作
投稿采訪
投稿采訪
出海管家
出海管家