我們的一些使用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政策中,替換為:
-占位符<Account_B-AWS-Account-ID>,具有賬戶B的AWS賬戶ID
-AppStream 2.0隊(duì)列和堆棧的占位符<Fleet-Name>和<Stack-Name>
-AppStream 2.0資源所在的占位符<region>。
·選擇審核政策。
·為您的策略命名,然后選擇創(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ì),以便您的用戶可以從此多帳戶部署中開始流式傳輸。