Как вызвать функцию, когда объект создан?

Я пробую Pulumi и создаю настройку Elasticbeanstalk, которая использует ведро s3 для хранения артефактов версии приложения.

Пулуми жалуется, что артефакт выпуска не находится в ведре s3 при создании ApplicationVersion

Updating (testing-stack):

     Type                                        Name                        Status                  Info
     pulumi:pulumi:Stack                         webserver-py-testing-stack  **failed**              1 error
 +   └─ aws:elasticbeanstalk:ApplicationVersion  dev-app-name                **creating failed**     1 error

Diagnostics:
  aws:elasticbeanstalk:ApplicationVersion (dev-app-name):
    error: Plan apply failed: InvalidParameterCombination: Unable to download from S3 location (Bucket: app-name-releases  Key: release2.zip). Reason: Not Found
        status code: 400, request id: e7d4a07e-f55b-4a13-a4cf-fe971982a441

  pulumi:pulumi:Stack (webserver-py-testing-stack):
    error: update failed

Resources:
    4 unchanged

Duration: 6s

конфигурация python пулуми

releases_bucket = s3.Bucket(
    resource_name=RELEASES_BUCKET,
    bucket=RELEASES_BUCKET,
)

def upload_release_zip(path, bucket_id):
    s3 = boto3.client('s3')
    s3.upload_file(Filename=str(path), Bucket=bucket_id, Key=path.name)


upload_release_zip = partial(upload_release_zip, path=Path('release2.zip'))

releases_bucket.id.apply(upload_release_zip)

application = Application(resource_name=ENV_APP_NAME, name=ENV_APP_NAME)

repository = ecr.Repository(resource_name=APP_NAME, name=APP_NAME)

app_version = ApplicationVersion(
    resource_name=ENV_APP_NAME,
    application=application,
    bucket=releases_bucket.id,
    key='release2.zip',
)
environment = Environment(
    application=application,
    resource_name=ENV_APP_NAME,
    name=ENV_APP_NAME,
    solution_stack_name=STACK,
    settings=BEANSTALK_ENVIRONMENT_SETTINGS,
    wait_for_ready_timeout=BEANSTALK_ENVIRONMENT_TIMEOUT,
    version=app_version,
)

Обратите внимание releases_bucket.id.apply(upload_release_zip) в приведенном выше примере, я сделал это, чтобы попытаться вызвать функцию загрузки до того, как произойдет ApplicationVersion, но она, похоже, не работает. Документы https://pulumi.io/reference/programming-model/#outputs Кажется, я не могу сказать «вызовите эту функцию после создания корзины s3».

Кто-нибудь знает как это сделать? В противном случае я вернусь к Terraform.


person NotHilaryClinton    schedule 13.06.2019    source источник


Ответы (1)


Попробуйте определить ресурс BucketObject вместо того, чтобы загружать файл вручную. Что-то в соответствии с

# upload_release_zip removed

obj = s3.BucketObject('release2.zip',
    bucket=releases_bucket.id,
    source=FileAsset('./release2.zip'))

app_version = elasticbeanstalk.ApplicationVersion(
    resource_name=ENV_APP_NAME,
    application=application,
    bucket=releases_bucket.id,
    key=obj.key
)
person Mikhail Shilkov    schedule 13.06.2019