跨賬戶資源和Amazon AppStream 2.0

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

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

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

先決條件

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

·帳戶B和C中的AppStream 2.0堆棧和隊(duì)列

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

在帳戶B中,打開IAM控制臺(tái)。這應(yīng)該是包含您的AppStream 2.0堆棧和隊(duì)列的帳戶。

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

選擇JSON標(biāo)簽。將以下JSON策略復(fù)制并粘貼到策略文檔框中:

{

    "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隊(duì)列和堆棧的占位符&lt;Fleet-Name&gt;和&lt;Stack-Name&gt;

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

·選擇審核政策。

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

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

  -對(duì)于“選擇受信任實(shí)體的類型”,選擇另一個(gè)AWS賬戶。

  -輸入賬戶A的AWS賬戶ID

·選擇下一步:權(quán)限。

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

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

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

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

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

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

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

選擇JSON標(biāo)簽。將以下JSON策略復(fù)制并粘貼到策略文檔框中:

{

    "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)建策略后,在導(dǎo)航窗格中選擇Roles,Create Role,然后配置以下框:

  -對(duì)于“選擇可信實(shí)體的類型”,選擇“AWS服務(wù)”。

  -對(duì)于將使用此角色的服務(wù),請(qǐng)選擇Lambda。

·選擇下一步:權(quán)限。

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

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

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

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

·在帳戶A中,打開Lambda控制臺(tái)。

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

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

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

  -命名您的功能。

  -對(duì)于Runtime,選擇Node.js12.X。

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

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

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

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

·在“功能代碼”部分中,將以下代碼復(fù)制并粘貼到選項(xià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': '*',

        },

    });

}

·替換所有占位符值。

·保存功能。

測(cè)試您的設(shè)置

·在帳戶A中,打開Lambda控制臺(tái)。

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

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

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

  -活動(dòng)模板應(yīng)為“Hello World”

  -為活動(dòng)命名

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

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

·創(chuàng)建活動(dòng)

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

·如果測(cè)試成功,則應(yīng)該返回一個(gè)AppStream 2.0流URL

·在網(wǎng)絡(luò)瀏覽器中復(fù)制并粘貼該URL以驗(yàn)證其功能

·使用其他電子郵件域重新配置測(cè)試事件,然后重復(fù)測(cè)試過(guò)程

清理

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

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

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

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

結(jié)論

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

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