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