使用默认网络模式从 Docker 容器中承担 Sagemaker Notebook 实例角色
Assume Sagemaker Notebook instance role from Docker container with default network mode
我有一个有趣的用例和一个问题。
我们正在利用 Sagemaker Notebooks 作为我们数据科学团队的开发环境。这些笔记本本质上是 EC2 实例,具有(相对)不错的 IDE(虽然不如 Cloud9)。
此外,我们在这些实例上 运行 一些 docker 容器。但是,我们被迫使用--network=host
模式,否则分配给Notebook Instance的角色不会在docker容器内部承担。
主机上(这里1234567890
是我们的账号,DataScientist
是Sagemaker Notebook实例附加的角色):
$ aws sts get-caller-identity
{
"UserId": "AROAU2P5VGYMMVxxxxxJ:SageMaker",
"Account": "1234567890",
"Arn": "arn:aws:sts::1234567890:assumed-role/DataScientist/SageMaker"
}
运行 Docker 容器内的相同命令与 --network=host
产生相同的结果:
$ docker run --network host amazon/aws-cli sts get-caller-identity
{
"UserId": "AROAU2P5VGYMMVxxxxxJ:SageMaker",
"Account": "1234567890",
"Arn": "arn:aws:sts::1234567890:assumed-role/DataScientist/SageMaker"
}
但是,它不适用于 Docker --network=bridge
:
$ docker run amazon/aws-cli sts get-caller-identity
{
"UserId": "AROAIMGPPFPT5T6N7BYX6:i-0b2a9080d5ed1cb98",
"Account": "366152344081",
"Arn": "arn:aws:sts::366152344081:assumed-role/BaseNotebookInstanceEc2InstanceRole/i-0b2a9080d5ed1cb98"
}
如您所见,这是一个完全不同的角色。请注意帐号 366152344081 和角色 ARN - 它在 AWS 内部。
我们希望保留 Docker(网桥)的默认网络选项,同时能够承担正确的角色(附加到 SageMaker Notebook 实例的角色,例如 DataScientist
我们的案例)连接到主机系统(Sagemaker Notebook)。是否有任何 hack(例如 iptable 规则等)来实现这一目标?
如果我们查看在干净的 Sagemaker Notebook 实例上创建的网络,我们会注意到一个名为 sagemaker-local
:
的用户定义桥接网络
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
f1d5a59a8c9e bridge bridge local
6142e6764495 host host local
194adfb00f0a none null local
99de6c086aa8 sagemaker-local bridge local
如果我们随后连接到这个自定义桥,我们将能够承担正确的角色(连接到 Sagemaker Notebook 实例本身的角色):
$ docker run --network sagemaker-local amazon/aws-cli sts get-caller-identity
{
"UserId": "AROAU2P5VGYMMVxxxxxJ:SageMaker",
"Account": "1234567890",
"Arn": "arn:aws:sts::1234567890:assumed-role/DataScientist/SageMaker"
}
更新
截至撰写本文时(2021 年 12 月 10 日),您不再需要连接到 sagemaker-local
桥接网络,默认的 bridge
也可以使用(注意 --network bridge
是隐含在这个调用中):
$ docker run amazon/aws-cli sts get-caller-identity
{
"UserId": "AROAU2P5VGYMMVxxxxxJ:SageMaker",
"Account": "1234567890",
"Arn": "arn:aws:sts::1234567890:assumed-role/DataScientist/SageMaker"
}
确保重新启动 SageMaker Notebook 实例。
此外,here我发现了一些手动修补程序(iptables 等),但随着更新它已经修补了。
感谢 AWS 解决了这个问题:)
我有一个有趣的用例和一个问题。
我们正在利用 Sagemaker Notebooks 作为我们数据科学团队的开发环境。这些笔记本本质上是 EC2 实例,具有(相对)不错的 IDE(虽然不如 Cloud9)。
此外,我们在这些实例上 运行 一些 docker 容器。但是,我们被迫使用--network=host
模式,否则分配给Notebook Instance的角色不会在docker容器内部承担。
主机上(这里1234567890
是我们的账号,DataScientist
是Sagemaker Notebook实例附加的角色):
$ aws sts get-caller-identity
{
"UserId": "AROAU2P5VGYMMVxxxxxJ:SageMaker",
"Account": "1234567890",
"Arn": "arn:aws:sts::1234567890:assumed-role/DataScientist/SageMaker"
}
运行 Docker 容器内的相同命令与 --network=host
产生相同的结果:
$ docker run --network host amazon/aws-cli sts get-caller-identity
{
"UserId": "AROAU2P5VGYMMVxxxxxJ:SageMaker",
"Account": "1234567890",
"Arn": "arn:aws:sts::1234567890:assumed-role/DataScientist/SageMaker"
}
但是,它不适用于 Docker --network=bridge
:
$ docker run amazon/aws-cli sts get-caller-identity
{
"UserId": "AROAIMGPPFPT5T6N7BYX6:i-0b2a9080d5ed1cb98",
"Account": "366152344081",
"Arn": "arn:aws:sts::366152344081:assumed-role/BaseNotebookInstanceEc2InstanceRole/i-0b2a9080d5ed1cb98"
}
如您所见,这是一个完全不同的角色。请注意帐号 366152344081 和角色 ARN - 它在 AWS 内部。
我们希望保留 Docker(网桥)的默认网络选项,同时能够承担正确的角色(附加到 SageMaker Notebook 实例的角色,例如 DataScientist
我们的案例)连接到主机系统(Sagemaker Notebook)。是否有任何 hack(例如 iptable 规则等)来实现这一目标?
如果我们查看在干净的 Sagemaker Notebook 实例上创建的网络,我们会注意到一个名为 sagemaker-local
:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
f1d5a59a8c9e bridge bridge local
6142e6764495 host host local
194adfb00f0a none null local
99de6c086aa8 sagemaker-local bridge local
如果我们随后连接到这个自定义桥,我们将能够承担正确的角色(连接到 Sagemaker Notebook 实例本身的角色):
$ docker run --network sagemaker-local amazon/aws-cli sts get-caller-identity
{
"UserId": "AROAU2P5VGYMMVxxxxxJ:SageMaker",
"Account": "1234567890",
"Arn": "arn:aws:sts::1234567890:assumed-role/DataScientist/SageMaker"
}
更新
截至撰写本文时(2021 年 12 月 10 日),您不再需要连接到 sagemaker-local
桥接网络,默认的 bridge
也可以使用(注意 --network bridge
是隐含在这个调用中):
$ docker run amazon/aws-cli sts get-caller-identity
{
"UserId": "AROAU2P5VGYMMVxxxxxJ:SageMaker",
"Account": "1234567890",
"Arn": "arn:aws:sts::1234567890:assumed-role/DataScientist/SageMaker"
}
确保重新启动 SageMaker Notebook 实例。
此外,here我发现了一些手动修补程序(iptables 等),但随着更新它已经修补了。
感谢 AWS 解决了这个问题:)