Skip to main content

AWS

我们与 AWS 的集成可根据您的配置将 AWS 资源导出到 Port。 您可以将集成定义为按计划运行和按事件运行。

我们与 AWS 的集成支持实时事件处理,因此可以在 Port 内部准确、实时地呈现 AWS 基础设施。

Port 的 AWS 输出程序是开源的,请查看源代码here

💡 AWS 输出程序常见用例

例如,我们的 AWS 导出器可让您利用 AWS 账户中的数据轻松丰富软件目录:

  • 映射账户中的资源,包括 S3数据桶lambda函数SQS队列RDS DB实例ECS服务和许多其他资源类型。
  • 被用于关系可在 Port 内创建完整、易懂的 AWS 账户地图。

工作原理

Port 的 AWS 输出程序可以检索AWS Cloud Control API 支持的所有资源。

开源 AWS 导出器允许您将 AWS 中的数据提取、转换、加载(ETL)到所需的软件目录数据模型中。

出口程序是使用安装在账户上的AWS serverless application 部署的。

The serverless application 需要一个JSON configuration file 来描述将数据加载到开发者门户的 ETL 流程,还需要一个具有必要权限的IAM policy 来列出和读取配置的资源。

导出器利用JQ JSON processor 对 AWS 对象中的现有字段和值进行选择、修改、连接、转换和其他操作。

导出器 config.json 文件

通过 config.json 文件,您可以指定要从 AWS 账户导出的确切资源,以及要在 Port 中填写数据的实体和属性。

下面是config.json文件的示例片段,演示了将`lambda 函数'数据从账户导入软件目录的 ETL 过程:

{
"resources": [
{
"kind": "AWS::Lambda::Function",
"selector": {
"aws": {
"regions": ["us-east-1", "us-west-1"]
}
},
"port": {
"entity": {
"mappings": [
{
"identifier": ".FunctionName",
"title": ".FunctionName",
"blueprint": "function",
"properties": {
"memory": ".MemorySize",
"timeout": ".Timeout",
"runtime": ".Runtime"
}
}
]
}
}
}
]
}

结构

  • config.json "文件的根键是 "resources "键;

  • kind "键是 AWS 云控制 API 中资源类型的指定符,遵循 "service-providers::service-name::data-type-name "格式:

    "resources": [
    {
    "kind": "AWS::Lambda::Function",
    ...

::tip 要使用 AWS CLI 生成受支持的资源类型列表,请结合以下命令的结果:

aws cloudformation list-types --type RESOURCE --visibility PUBLIC --provisioning-type FULLY_MUTABLE
aws cloudformation list-types --type RESOURCE --visibility PUBLIC --provisioning-type IMMUTABLE
aws cloudformation list-types --type RESOURCE --visibility PRIVATE --provisioning-type FULLY_MUTABLE
aws cloudformation list-types --type RESOURCE --visibility PRIVATE --provisioning-type IMMUTABLE

要确定是否支持特定的 <RESOURCE_TYPE>,请使用此命令(需要 JQ,输出为 truefalse):

aws cloudformation describe-type --type RESOURCE --type-name <RESOURCE_TYPE> --query "ProvisioningType" | jq -c '. == "FULLY_MUTABLE" or . == "IMMUTABLE"'

更多信息,请阅读here :

  • selector "键可以让你准确地筛选出指定 "类型 "中的哪些对象将被收录到软件目录中;

  • 选择器 "中的 "查询 "键是一个 JQ 布尔值查询。如果对某个对象的评估值为 false,则不会同步该对象;

  • 选择器 "中的 "aws "键允许你指定要同步的 "区域 "列表。

    "resources": [
    {
    "kind": "AWS::Lambda::Function",
    "selector": {
    "query": "true",
    "aws": {
    "regions": [
    "us-east-1",
    "us-west-1"
    ]
    }
    },
    "port":
    ...
您可以选择在每个地区部署导出器,也可以选择在一个地区部署导出器。 如果您想在一个地区安装导出器,但要导出多个地区的数据,"地区 "配置键可能会有用:

一些被用于的示例:

  • 要同步默认区域中指定 "类型 "的所有对象,请勿指定 "选择器";

  • 同步不属于 AWS Amplify 服务的所有 lambdas:

    query: .FunctionName | startswith("amplify") | not
  • 等等

信息

  • 对于某些资源,您必须提供额外的信息。例如,为了同步特定负载平衡器的所有 AWS ELB 监听器,请使用 regions_configresources_models 键:

    "selector": {
    "aws": {
    "regions": [
    "eu-west-1"
    ],
    "regions_config": {
    "eu-west-1": {
    "resources_models": [
    "{\"LoadBalancerArn\": \"<AWS_ELB_ARN>\"}"
    ]
    }
    }
    }
    }

带有所需属性的特殊资源表可在here 上找到:

  • Port"、"实体 "和 "映射 "键打开了用于将 AWS 资源字段映射到Port实体的部分,"映射 "键是一个数组,其中每个对象都与entity 的结构相匹配。

  • 除了 blueprint 必须是静态字符串外,每个映射值都是 JQ 查询。

  • 映射中的 "itemsToParse "键使从单个 AWS 资源创建多个实体成为可能。

    • 任何 JQ 表达式都可以在这里被用于,只要它的 evaluated 值是一个项目数组。
    • 项目 "将作为一个键添加到 JQ 上下文中,该键包含对 "itemsToParse "中指定的数组中的项目的引用。对于对象数组,可以使用 .item.KEY_NAME语法访问对象中的键。

    "resources": [
    {
    "kind": "AWS::Lambda::Function",
    "selector": {
    "aws": {
    "regions": [
    "us-east-1",
    "us-west-1"
    ]
    }
    },
    "port": {
    "entity": {
    "mappings": [
    {
    "identifier": ".FunctionName",
    "title": ".FunctionName",
    "blueprint": "function",
    "properties": {
    "memory": ".MemorySize",
    "timeout": ".Timeout",
    "runtime": ".Runtime"
    }
    },
    {
    "itemsToParse": ".Layers",
    "identifier": ".item",
    "title": ".item",
    "blueprint": "functionLayer",
    "properties": {}
    }
    ]
    }
    }
    }
    ...
重要
  • 当资源之间存在关系时,资源的顺序很重要。 AWS 输出程序将按照config.json中的顺序同步资源,因此请确保按照逻辑顺序对资源进行排序。 例如,如果您有从 SNS Topic 到 lambda 函数的关系,请将 Lambda 函数配置放在前面。
  • 从本质上讲,AWS 输出程序将保持未映射属性的值不变。有关不同实体创建策略的进一步解释,请访问here
查看资源类型模式 要查看资源类型模式并用它来组成映射,请使用this 引用。

请注意,并非参考资料中列出的所有资源类型都可与云控制 API 配合使用。确定资源类型是否可用的方法讨论了here

有关其他选项和信息,请阅读here

更改配置

默认情况下,出口程序会在安装时将预先配置好的 config.json 文件保存到AWS S3 Bucket 。S3 存储桶名为 port-aws-exporter-<AWS_REGION>-<AWS_ACCOUNT_ID>,由出口程序创建。

更改配置(例如更改某个属性的映射):

  1. 从数据桶中创建一个 config.json 文件副本,进行所需的更改,并将其保存到本地。
  2. 使用 AWS CLI 将文件上传到数据桶,替换现有文件。
    用您的 Values 替换 <BUCKET_NAME><PATH_TO_CONFIG_FILE>,然后运行以下命令:
aws s3api put-object --bucket "<BUCKET_NAME>" --key "config.json" --body "<PATH_TO_CONFIG_FILE>"

IAM 政策

AWS 导出器使用AWS IAM Policy ,其中指定了要导出的 AWS 资源(在config.json 中配置的资源)的 listread 权限 。

例如,要导出 "lambda 函数",需要创建一个定义如下的策略:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"lambda:GetFunction",
"lambda:GetFunctionCodeSigningConfig",
"lambda:ListFunctions"
],
"Resource": "*"
}
]
}
查找策略的资源操作 为了查找应添加到策略中的资源操作,应查看资源类型模式,并查找readlist处理程序的权限。

使用以下命令获取特定 <RESOURCE_TYPE> 的资源操作(需要 AWS CLI 和 JQ):

aws cloudformation describe-type --type RESOURCE --type-name <RESOURCE_TYPE> --query "Schema" | jq -c 'fromjson | .handlers | with_entries(select([.key] | inside(["list", "read"]))) | map(.permissions) | flatten'

更多详细信息,请访问here

Port证书secret

为了管理 Port 中的实体,出口程序需要访问您的 Port 凭据,这些凭据通过AWS Secrets Manager secret 提供给出口程序。

secret值应采用以下格式:

{ "id": "<CLIENT_ID>", "clientSecret": "<CLIENT_SECRET>" }

与邮政信箱类似,您可以创建和管理自己的secret,也可以委托出口商管理。 无论哪种方式,您都需要在secret准备就绪后,自行将 Port 的凭据添加到secret中。

导出器 AWS 无服务器应用程序

出口商 AWS 无服务器应用程序 "是您安装出口商CloudFormation stack 的方式。

堆栈由几个部分组成:

  • S3 bucket - 应保存config.json 的位置;
  • ASM secret - 应保存 Port 凭据(客户 ID 和 secret)的位置 ,以便输出程序与 Port 的 API 交互;
  • Lambda function - 您可以调用以运行输出程序代码的资源。IAM policy 连接到 Lambda 函数的执行角色;
  • SQS queue - 事件队列,供输出程序使用。请阅读here ,了解如何使用导出器消费来自不同 AWS 服务的实时事件并对其采取行动;
  • EventsBridge scheduled rule - 按计划运行输出程序的规则。

开始

继续访问Installation 部分,在您的 Port 环境中设置 AWS 输出程序。