亚马逊云科技连接¶
亚马逊云科技连接类型支持 AWS 集成。
重要
亚马逊云科技连接可以在 UI/API 中测试,也可以通过调用 test_connection()
进行测试,正确 解释此测试的结果非常重要。在此测试期间,Amazon Provider 的组件会调用 AWS Security Token Service API GetCallerIdentity。此服务只能检查您的凭证是否有效。遗憾的是,无法验证凭证是否可以访问特定的 AWS 服务。
如果您使用 Amazon Provider 与兼容 AWS API 的服务(MinIO、LocalStack 等)进行通信,则测试连接失败并不意味着您的连接的凭证错误。许多兼容服务仅提供有限数量的 AWS API 服务,并且其中大多数服务未实现 AWS STS GetCallerIdentity 方法。
向 AWS 进行身份验证¶
可以使用 Boto3 指南 凭证 中描述的任何选项执行身份验证。或者,可以将凭证作为连接初始化参数传递。
要使用 IAM 实例配置文件,请创建一个“空”连接(即未指定 AWS 访问密钥 ID 或 AWS 秘密访问密钥的连接,或 aws://
)。
默认连接 ID¶
默认连接 ID 为 aws_default
。如果您运行 Airflow 的环境/机器在 ${HOME}/.aws/
中具有文件凭证,并且默认连接的用户和密码字段为空,则它将自动从此处获取凭证。
重要
以前,aws_default
连接在安装时将“extras”字段设置为 {"region_name": "us-east-1"}
。这意味着默认情况下,aws_default
连接使用 us-east-1
区域。现在情况已不再如此,需要在 Airflow 的连接屏幕中或通过 AWS_DEFAULT_REGION
环境变量手动设置区域。
注意
如果您没有运行“airflow connections create-default-connections”命令,则很可能没有 aws_default
。出于历史原因,如果缺少连接 ID,Amazon Provider 组件(钩子、操作符、传感器等)会回退到默认的 boto3 凭证策略。
如果您需要使用默认的 boto3 凭证策略(环境变量中的凭证、IAM 配置文件等),请提供 None
,而不是缺少的连接 ID,以避免在日志中收到警告。
配置连接¶
- AWS 访问密钥 ID(可选)
指定用于初始连接的 AWS 访问密钥 ID。如果您通过在额外字段中指定
role_arn
来执行 承担角色,则临时凭证将用于后续对 AWS 的调用。- AWS 秘密访问密钥(可选)
指定用于初始连接的 AWS 秘密访问密钥。如果您通过在额外字段中指定
role_arn
来执行 承担角色,则临时凭证将用于后续对 AWS 的调用。- 额外(可选)
指定可在 AWS 连接中使用的额外参数(作为 json 字典)。所有参数都是可选的。
以下额外参数用于创建初始
boto3.session.Session
aws_access_key_id
:用于初始连接的 AWS 访问密钥 ID。aws_secret_access_key
:用于初始连接的 AWS 秘密访问密钥aws_session_token
:如果您使用外部凭证,则用于初始连接的 AWS 会话令牌。您负责续订这些令牌。region_name
:连接的 AWS 区域。profile_name
:要使用的配置文件的名称,列在 配置和凭证文件设置 中。
以下额外参数用于 承担角色
role_arn
:如果指定,则承担此角色,使用assume_role_method
获取一组临时安全凭证。assume_role_method
:AWS STS 客户端方法,assume_role、assume_role_with_saml 或 assume_role_with_web_identity 之一,如果未指定,则使用 assume_role。assume_role_kwargs
:传递给assume_role_method
的其他 kwargs。
如果
assume_role_method
设置为assume_role_with_web_identity
,则可以使用以下额外参数assume_role_with_web_identity_federation
:联合类型,用于确定使用哪个令牌加载器来检索访问令牌。当前支持file
和google
。assume_role_with_web_identity_token_file
:文件系统上包含用于向 AWS STS 服务进行身份验证的访问令牌的文件的路径,用于file
联合类型。如果未指定,则将使用AWS_WEB_IDENTITY_TOKEN_FILE
环境变量的值。assume_role_with_web_identity_federation_audience
:访问令牌的aud
声明,如果使用google
联合类型。
以下额外参数传递给
boto3.session.Session.client()
或boto3.session.Session.resource()
。config_kwargs
:用于构造 botocore.config.Config 的其他 kwargs。要匿名访问公共 AWS 资源(相当于 signature_version=botocore.UNSGINED),请在 config_kwargs 中设置 “signature_version”=”unsigned”。endpoint_url
:连接的全局端点 URL。您可以通过使用service_config
为每个 AWS 服务指定端点 URL,有关更多详细信息,请参阅 AWS 服务端点 URL 配置verify
:是否验证 SSL 证书。False
- 不验证 SSL 证书。path/to/cert/bundle.pem - 要使用的 CA 证书包的文件名。如果您想使用与 botocore 使用的 CA 证书包不同的 CA 证书包,则可以指定此参数。
以下额外参数用于特定的 AWS 服务
service_config
:用于为每个 AWS 服务/Amazon 提供程序钩子指定配置/参数的 json,有关更多详细信息,请参阅 每项服务的配置。
警告
以下额外参数已弃用,并将在未来版本的此提供程序中删除。
aws_account_id
:用于构造role_arn
(如果未指定)。aws_iam_role
:用于构造role_arn
(如果未指定)。external_id
:当您在另一个帐户中承担角色时可能需要的唯一标识符。如果未指定assume_role_kwargs
中的ExternalId
,则使用。s3_config_file
:本地凭证文件的路径。s3_config_format
:s3_config_file
格式,aws、boto 或 s3cmd 之一,如果未指定,则使用 boto。profile
:如果要从s3_config_file
获取凭据,则可以使用此参数指定配置文件。host
:用作连接的 URL。请改用endpoint_url
。session_kwargs
:传递给boto3.session.Session
的其他 kwargs。
如果要通过 URI 配置连接,请确保对 URI 的所有组件进行 URL 编码。
示例¶
创建连接并转换为 URI 的代码段¶
import os from airflow.models.connection import Connection conn = Connection( conn_id="sample_aws_connection", conn_type="aws", login="AKIAIOSFODNN7EXAMPLE", # Reference to AWS Access Key ID password="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", # Reference to AWS Secret Access Key extra={ # Specify extra parameters here "region_name": "eu-central-1", }, ) # Generate Environment Variable Name and Connection URI env_key = f"AIRFLOW_CONN_{conn.conn_id.upper()}" conn_uri = conn.get_uri() print(f"{env_key}={conn_uri}") # AIRFLOW_CONN_SAMPLE_AWS_CONNECTION=aws://AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI%2FK7MDENG%2FbPxRfiCYEXAMPLEKEY@/?region_name=eu-central-1 os.environ[env_key] = conn_uri print(conn.test_connection()) # Validate connection credentials.警告
使用 Airflow CLI 时,可能需要在以下情况下添加
@
登录名
密码
主机
端口
未给出,请参见下面的示例。这是一个已知的 Airflow 限制。
airflow connections add aws_conn --conn-uri aws://@/?region_name=eu-west-1
使用实例配置文件¶
这将使用 Boto 的默认凭据查找链(~/.boto/ 配置文件中名为“default”的配置文件,以及在 AWS 内部运行时的实例配置文件)
URI 格式示例
export AIRFLOW_CONN_AWS_DEFAULT=aws://JSON 格式示例
export AIRFLOW_CONN_AWS_DEFAULT='{"conn_type": "aws"}'
使用 AWS IAM 密钥对¶
URI 格式示例
export AIRFLOW_CONN_AWS_DEFAULT=aws://AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI%2FK7MDENG%2FbPxRfiCYEXAMPLEKEY@请注意,这里的秘密访问密钥已进行 URL 编码(将
/
更改为%2F
),并且末尾带有@
(如果没有,它将被视为<host>:<port>
并且无法正常工作)JSON 格式示例
export AIRFLOW_CONN_AWS_DEFAULT='{ "conn_type": "aws", "login": "AKIAIOSFODNN7EXAMPLE", "password": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" }'
Extra 字段的示例¶
使用 ~/.aws/credentials 和 ~/.aws/config 文件,以及配置文件。
这假定所有其他连接字段(例如 AWS 访问密钥 ID 或 AWS 秘密访问密钥)为空。
{
"profile_name": "my_profile"
}
指定要承担的 role_arn 和 region_name
{
"role_arn": "arn:aws:iam::112223334444:role/my_role",
"region_name": "ap-southeast-2"
}
另请参阅
配置出站 HTTP 代理
{
"config_kwargs": {
"proxies": {
"http": "http://myproxy.mycompany.local:8080",
"https": "http://myproxy.mycompany.local:8080"
}
}
}
使用 AssumeRoleWithWebIdentity(基于文件的令牌)
{
"role_arn": "arn:aws:iam::112223334444:role/my_role",
"assume_role_method": "assume_role_with_web_identity",
"assume_role_with_web_identity_federation": "file",
"assume_role_with_web_identity_token_file": "/path/to/access_token"
}
使用 AssumeRoleWithSAML
{
"region_name":"eu-west-1",
"role_arn":"arn:aws:iam::112223334444:role/my_role",
"assume_role_method":"assume_role_with_saml",
"assume_role_with_saml":{
"principal_arn":"arn:aws:iam::112223334444:saml-provider/my_saml_provider",
"idp_url":"https://idp.mycompany.local/.../saml/clients/amazon-aws",
"idp_auth_method":"http_spegno_auth",
"mutual_authentication":"OPTIONAL",
"idp_request_kwargs":{
"headers":{"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"},
"verify":false
},
"idp_request_retry_kwargs": {
"total": 10,
"backoff_factor":1,
"status":10,
"status_forcelist": [400, 429, 500, 502, 503, 504]
},
"log_idp_response":false,
"saml_response_xpath":"////INPUT[@NAME='SAMLResponse']/@VALUE",
},
"assume_role_kwargs": { "something":"something" }
}
以下设置可以在 Extra 的 assume_role_with_saml
容器中使用。
principal_arn
:在 IAM 中创建的 SAML 提供程序的 ARN,用于描述身份提供程序。
idp_url
:指向 IDP 端点的 URL,该端点提供 SAML 断言。
idp_auth_method
:指定“http_spegno_auth”以使用 Pythonrequests_gssapi
库。此库比requests_kerberos
更新,并且向后兼容。请参阅 PyPI 上的requests_gssapi
文档。
mutual_authentication
:可以是“REQUIRED”、“OPTIONAL”或“DISABLED”。请参阅 PyPI 上的requests_gssapi
文档。
idp_request_kwargs
:从 IDP(通过 HTTP/S)请求时传递给requests
的其他kwargs
。
idp_request_retry_kwargs
:用于构造 urllib3.util.Retry 的其他kwargs
,用作从 IDP 请求时的重试策略。
log_idp_response
:对调试很有用 - 如果指定,则将 IDP 响应内容打印到日志。请注意,成功的响应将包含敏感信息!
saml_response_xpath
:如何使用 XML / HTML xpath 查询 IDP 响应。
assume_role_kwargs
:传递给sts_client.assume_role_with_saml
的其他kwargs
。
注意
requests_gssapi
库用于从 IDP 获取 SAML 响应。您可能需要 pip uninstall python-gssapi
并 pip install gssapi
来代替它才能正常工作。python-gssapi
库已过 outdated,并且与 Airflow 在其他地方使用的某些版本的 paramiko
冲突。
另请参阅
每项服务的配置¶
AWS 服务端点 URL 配置¶
要在单个连接中为每个特定的 AWS 服务使用 endpoint_url
,您可以在服务配置中进行设置。为了强制执行默认的 botocore
/boto3
行为,您可以将值设置为 null
。优先级规则如下
在服务级别指定的
endpoint_url
。在连接额外的根级别指定的
endpoint_url
。请注意,在承担角色或测试连接中使用的 sts 客户端不使用全局参数。默认的
botocore
/boto3
行为
{
"endpoint_url": "s3.amazonaws.com"
"service_config": {
"s3": {
"endpoint_url": "https://s3.eu-west-1.amazonaws.com"
},
"sts": {
"endpoint_url": "https://sts.eu-west-2.amazonaws.com"
},
"ec2": {
"endpoint_url": null
}
}
}
避免限制异常¶
Amazon Web Services 对并发 API 调用有限制,因此频繁调用 apache-airflow-providers-amazon
组件可能会在执行过程中失败并出现限制异常,例如 *ThrottlingException*、*ProvisionedThroughputExceededException*。
botocore.config.Config
支持开箱即用的不同指数退避模式:legacy
、standard
、adaptive
默认情况下,botocore.config.Config
使用 legacy
模式,最多重试 5 次,这在某些情况下可能不够。
如果遇到限制异常,您可以将模式更改为 standard
并增加重试次数。
另请参阅
Boto3 指南:重试
在连接中设置¶
- 连接额外字段:
{ "config_kwargs": { "retries": { "mode": "standard", "max_attempts": 10 } } }
在 AWS 配置文件中设置¶
- ~/.aws/config:
[profile awesome_aws_profile] retry_mode = standard max_attempts = 10
- 连接额外字段:
{ "profile_name": "awesome_aws_profile" }
通过环境变量设置¶
注意
这将为所有连接设置重试模式,除非在特定连接上显式设置了其他重试配置。
export AWS_RETRY_MODE=standard export AWS_MAX_ATTEMPTS=10
会话工厂¶
连接的默认 BaseSessionFactory
可以处理 AWS 的大多数身份验证方法。如果您希望完全控制 boto3.session.Session
的创建,或者您正在使用需要 外部进程来获取凭据 的自定义 联合身份验证,则可以根据需要对 BaseSessionFactory
进行子类化,并覆盖 create_session
和/或 _create_basic_session
方法。
您还需要为 AwsBaseHook
添加配置,以通过其完整路径使用自定义实现。
示例¶
- 配置:
[aws] session_factory = my_company.aws.MyCustomSessionFactory
- 连接额外字段:
{ "federation": { "username": "my_username", "password": "my_password" } }
- 自定义会话工厂:
def get_federated_aws_credentials(username: str, password: str): """ Mock interaction with federation endpoint/process and returns AWS credentials. """ return { "Version": 1, "AccessKeyId": "key", "SecretAccessKey": "secret", "SessionToken": "token", "Expiration": "2050-12-31T00:00:00.000Z", } class MyCustomSessionFactory(BaseSessionFactory): @property def federated(self): return "federation" in self.extra_config def _create_basic_session(self, session_kwargs: dict[str, Any]) -> boto3.session.Session: if self.federated: return self._create_federated_session(session_kwargs) else: return super()._create_basic_session(session_kwargs) def _create_federated_session(self, session_kwargs: dict[str, Any]) -> boto3.session.Session: username = self.extra_config["federation"]["username"] region_name = self._get_region_name() self.log.debug( f"Creating federated session with username={username} region_name={region_name} for " f"connection {self.conn.conn_id}" ) credentials = RefreshableCredentials.create_from_metadata( metadata=self._refresh_federated_credentials(), refresh_using=self._refresh_federated_credentials, method="custom-federation", ) session = botocore.session.get_session() session._credentials = credentials session.set_config_variable("region", region_name) return boto3.session.Session(botocore_session=session, **session_kwargs) def _refresh_federated_credentials(self) -> dict[str, str]: self.log.debug("Refreshing federated AWS credentials") credentials = get_federated_aws_credentials(**self.extra_config["federation"]) access_key_id = credentials["AccessKeyId"] expiry_time = credentials["Expiration"] self.log.info( f"New federated AWS credentials received with aws_access_key_id={access_key_id} and " f"expiry_time={expiry_time} for connection {self.conn.conn_id}" ) return { "access_key": access_key_id, "secret_key": credentials["SecretAccessKey"], "token": credentials["SessionToken"], "expiry_time": expiry_time, }
使用 Web 身份联合身份验证进行 Google Cloud 到 AWS 的身份验证¶
借助 Web 身份联合身份验证,您可以使用 Google Cloud 平台的凭据在 Amazon Web Service 平台中授权访问。如果您另外使用从 元数据服务器 或 工作负载身份 获取的访问令牌进行授权,则可以通过消除长期凭据来提高环境的安全性。
Google Cloud 凭据通过 AWS Security Token Service 交换为 Amazon Web Service 临时凭据。
下图说明了用于获取 AWS 凭据的典型通信流程。
角色设置¶
为了让 AWS 识别 Google 身份,您必须在 AWS 中配置角色。
您可以使用角色向导或 Terraform 来完成此操作。
角色向导¶
为 Web 身份联合创建 IAM 角色
登录 AWS 管理控制台,并在 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。
在导航窗格中,选择“角色”,然后选择“创建角色”。
选择“Web 身份”角色类型。
对于身份提供商,请选择“Google”。
在“受众”框中键入服务帐户电子邮件地址(格式为
<NAME>@<PROJECT_ID>.iam.gserviceaccount.com
)。查看您的 Web 身份信息,然后选择“下一步:权限”。
选择要用作权限策略的策略,或选择“创建策略”以打开新的浏览器选项卡并从头开始创建新策略。有关更多信息,请参阅 创建 IAM 策略。
选择“下一步:标签”。
(可选)通过附加标签作为键值对,将元数据添加到角色。有关在 IAM 中使用标签的更多信息,请参阅 标记 IAM 用户和角色。
选择“下一步:查看”。
对于“角色名称”,请输入角色名称。角色名称在您的 AWS 账户中必须是唯一的。
(可选)对于“角色描述”,请输入新角色的描述。
查看角色,然后选择“创建角色”。
有关更多信息,请参阅:为 Web 身份或 OpenID Connect 联合创建角色(控制台)
最后,您应该获得一个角色,其策略类似于以下内容
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "accounts.google.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"accounts.google.com:aud": "<NAME>@<PROJECT_ID>.iam.gserviceaccount.com"
}
}
}
]
}
为了防止滥用 Google OpenID 令牌,您还可以通过为每个受众配置限制来限制使用范围。您需要为连接配置相同的值,然后此值也包含在 ID 令牌中。AWS 将测试此值是否匹配。为此,您可以向策略添加新条件。
{
"Condition": {
"StringEquals": {
"accounts.google.com:aud": "<NAME>@<PROJECT_ID>.iam.gserviceaccount.com",
"accounts.google.com:oaud": "service-amp.my-company.com"
}
}
}
创建角色后,您应该在 Airflow 中配置连接。
Terraform¶
为了快速配置新角色,您可以使用以下 Terraform 脚本,该脚本配置 AWS 角色以及分配的策略。在使用它之前,您需要更正 locals
部分中的变量以适合您的环境
google_service_account
- 将有权使用此角色的服务帐户的电子邮件地址google_openid_audience
- 在 Airflow 角色和连接中配置的常量值。它可以防止滥用 Google ID 令牌。aws_role_name
- 新 AWS 角色的名称。aws_policy_name
- 新 AWS 策略的名称。
有关使用 Terraform 脚本的更多信息,请参阅:Terraform 文档 - 入门 - AWS
执行计划后,您应该在 Airflow 中配置连接。
连接设置¶
为了使用 Google 身份,在连接设置的额外部分中,字段 "assume_role_method"
必须为 "assume_role_with_web_identity"
,字段 "assume_role_with_web_identity_federation"
必须为 "google"
。它还要求您在 "role_arn"
字段中设置角色。或者,您可以通过配置 "assume_role_with_web_identity_federation_audience"
字段来限制 Google Open ID 令牌的使用。这些字段的值必须与角色中配置的值匹配。
Airflow 将根据 应用程序默认凭据 建立 Google 凭据。
以下是连接配置示例。
{
"role_arn": "arn:aws:iam::240057002457:role/WebIdentity-Role",
"assume_role_method": "assume_role_with_web_identity",
"assume_role_with_web_identity_federation": "google",
"assume_role_with_web_identity_federation_audience": "service_a.apache.com"
}
您还可以使用环境变量 AIRFLOW_CONN_{CONN_ID}
来配置连接。
export AIRFLOW_CONN_AWS_DEFAULT="aws://\
?role_arn=arn%3Aaws%3Aiam%3A%3A240057002457%3Arole%2FWebIdentity-Role&\
assume_role_method=assume_role_with_web_identity&\
assume_role_with_web_identity_federation=google&\
assume_role_with_web_identity_federation_audience=aaa.polidea.com"
在 EKS 上使用 IAM Roles for Service Accounts (IRSA)¶
如果您在 Amazon EKS 上运行 Airflow,您可以通过向其服务帐户授予 IAM 角色来向 Airflow 服务授予 AWS 相关权限(例如用于远程日志记录的 S3 读/写)。IRSA 为在 EKS 上运行并使用其他 AWS 服务的应用程序(例如,pod)提供细粒度的权限管理。这些应用程序可以使用 S3、任何其他 AWS 服务,例如 Secrets Manager、CloudWatch、DynamoDB 等。
要激活此功能,必须执行以下步骤
在 EKS 集群上创建 IAM OIDC 提供程序。
使用在步骤 1 中创建的 Web 身份提供程序,创建要附加到 Airflow 服务帐户的 IAM 角色和策略。
将相应的 IAM 角色作为注释添加到 Airflow 服务帐户。
然后,您可以在 Amazon EKS Pod Identity Web Hook 添加的相应 pod 的环境变量中找到 AWS_ROLE_ARN
和 AWS_WEB_IDENTITY_TOKEN_FILE
。然后,boto3 将使用这些变量配置凭据。为了在 Airflow 中使用 IRSA,您必须创建一个所有字段都为空的 aws 连接。如果设置了 role-arn
等字段,Airflow 将不会遵循 boto3 默认流程,因为它会使用连接字段手动创建会话。如果您没有更改默认连接 ID,则名为 aws_default
的空 AWS 连接就足够了。
使用 eksctl 创建 IAM Roles for Service Account(IRSA)¶
eksctl 是一个用于在 EKS 上创建和管理集群的简单 CLI 工具。按照以下步骤为 Airflow 创建 IRSA。
在您的本地机器上 安装 eksctl。
在您的终端中设置 AWS 凭据以运行
eksctl
命令。默认情况下不启用 IAM OIDC 提供程序,您可以使用以下命令启用。
eksctl utils associate-iam-oidc-provider --cluster="<EKS_CLUSTER_ID>" --approve
4. 替换 EKS_CLUSTER_ID
、SERVICE_ACCOUNT_NAME
和 NAMESPACE
并执行以下命令。此命令将使用现有的 EKS 集群 ID 并创建 IAM 角色、服务帐户和命名空间。
eksctl create iamserviceaccount --cluster="<EKS_CLUSTER_ID>" --name="<SERVICE_ACCOUNT_NAME>" --namespace="<NAMESPACE>" --attach-policy-arn="<IAM_POLICY_ARN>" --approve``
这是一个带有值的示例命令。此示例使用附加到 IAM 角色的具有完整 S3 权限的托管策略。我们强烈建议您创建一个具有 S3、Secrets Manager、CloudWatch 等必要权限的受限 IAM 策略,并将其与 --attach-policy-arn
一起使用。
eksctl create iamserviceaccount --cluster=airflow-eks-cluster --name=airflow-sa --namespace=airflow --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3FullAccess --approve
在 Airflow Helm 图表部署中或与 Kubernetes Pod Operator 一起使用服务帐户名称。
使用 Terraform 创建 IAM Roles for Service Account(IRSA)¶
对于 Terraform 用户,可以使用 Amazon EKS Blueprints for Terraform 模块创建 IRSA 角色。
此模块创建一个新的 IAM 角色、服务帐户和命名空间。这会将 IAM 角色与服务帐户相关联,并将注释添加到服务帐户。您需要创建一个 IAM 策略,其中包含您希望 pod 中的容器具有的所需权限。将 IAM_POLICY_ARN
替换为您的 IAM 策略 ARN,其他必需的输入如下所示,然后运行 terraform apply
。
module "airflow_irsa" {
source = "github.com/aws-ia/terraform-aws-eks-blueprints//modules/irsa"
eks_cluster_id = "<EKS_CLUSTER_ID>"
eks_oidc_provider_arn = "<EKS_CLUSTER_OIDC_PROVIDER_ARN>"
irsa_iam_policies = ["<IAM_POLICY_ARN>"]
kubernetes_namespace = "<NAMESPACE>"
kubernetes_service_account = "<SERVICE_ACCOUNT_NAME>"
}
应用 Terraform 模块后,您可以在 Airflow 部署中或与 Kubernetes Pod Operator 一起使用服务帐户。