I'm attempting to parameterize the name of a secre...
# prefect-community
l
I'm attempting to parameterize the name of a secret for a flow. This attempt is not working:
👀 1
Copy code
from prefect import Flow, Parameter, task
from prefect.tasks.secrets import PrefectSecret


with Flow("parameter_to_secret") as flow:
    aws_credentials_secret_name = Parameter(
        'aws_credentials_secret_name', default='AWS_CREDENTIALS',
    )
    aws_credentials = PrefectSecret(aws_credentials_secret_name)
    aws_credentials['ACCESS_KEY']


if __name__ == "__main__":
    flow.run()

"""
Traceback (most recent call last):
  File ".../workflow_parameter_to_secret.py", line 10, in <module>
    aws_credentials = PrefectSecret(aws_credentials_secret_name)
  File ".../lib/python3.7/site-packages/prefect/tasks/secrets/base.py", line 48, in __init__
    super().__init__(**kwargs)
  File ".../lib/python3.7/site-packages/prefect/tasks/secrets/base.py", line 29, in __init__
    super().__init__(**kwargs)
  File ".../lib/python3.7/site-packages/prefect/core/task.py", line 209, in __init__
    self.logger = logging.get_logger(self.name)
  File ".../lib/python3.7/site-packages/prefect/utilities/logging.py", line 281, in get_logger
    return prefect_logger.getChild(name)
  File ".../lib/python3.7/logging/__init__.py", line 1649, in getChild
    suffix = '.'.join((self.name, suffix))
TypeError: sequence item 1: expected str instance, Parameter found
"""
More generally, I'd like dev / prod versions of flows to be able to use different credentials. I guess I can keep the secret name the same and change the values per environment
and also use
use_local_secrets = true/false
in
config.toml
d
Hi @Luke Orland! Try this:
Copy code
aws_secret = PrefectSecret(name=None) # initializes Task, unrelated to binding it within a Flow

with Flow("parameter_to_secret") as flow:
    aws_credentials_secret_name = Parameter(
        'aws_credentials_secret_name', default='AWS_CREDENTIALS',
    )

    aws_credentials = aws_secret(name=aws_credentials_secret_name) # calls the task, actually creates a task dependency
    aws_credentials['ACCESS_KEY']
🙏 1
l
That works. Essentially, it's
Copy code
aws_credentials = PrefectSecret(name=None)(name=aws_credentials_secret_name)
d
Exactly