Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions providers/amazon/docs/operators/ecr.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
.. Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

.. http://www.apache.org/licenses/LICENSE-2.0

.. Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.

=======================================
Amazon Elastic Container Registry (ECR)
=======================================

`Amazon Elastic Container Registry (ECR) <https://aws.amazon.com/ecr/>`__ is a managed container registry
for storing, sharing, and deploying container images and artifacts.

Prerequisite Tasks
------------------

.. include:: ../_partials/prerequisite_tasks.rst

Generic Parameters
------------------

.. include:: ../_partials/generic_parameters.rst

Operators
---------

.. _howto/operator:EcrCreateRepositoryOperator:

Create an ECR repository
========================

To create an ECR repository, use
:class:`~airflow.providers.amazon.aws.operators.ecr.EcrCreateRepositoryOperator`.
This operator can provision a repository before a workflow builds or pushes container images.
The operator returns the complete response from the Boto3 ``create_repository`` API operation.

.. exampleinclude:: /../../amazon/tests/system/amazon/aws/example_ecr.py
:language: python
:dedent: 4
:start-after: [START howto_operator_ecr_create_repository]
:end-before: [END howto_operator_ecr_create_repository]

.. _howto/operator:EcrSetRepositoryPolicyOperator:

Set an ECR repository policy
============================

To set the repository policy for an ECR repository, use
:class:`~airflow.providers.amazon.aws.operators.ecr.EcrSetRepositoryPolicyOperator`.
This operator can configure permissions such as cross-account access to images stored in the repository.
The operator returns the complete response from the Boto3 ``set_repository_policy`` API operation.

.. exampleinclude:: /../../amazon/tests/system/amazon/aws/example_ecr.py
:language: python
:dedent: 4
:start-after: [START howto_operator_ecr_set_repository_policy]
:end-before: [END howto_operator_ecr_set_repository_policy]

.. _howto/operator:EcrDeleteRepositoryOperator:

Delete an ECR repository
========================

To delete an ECR repository, use
:class:`~airflow.providers.amazon.aws.operators.ecr.EcrDeleteRepositoryOperator`.
This operator can clean up temporary repositories or repositories that are no longer needed.
Set ``force=True`` to delete a repository that contains images. The operator returns the complete response
from the Boto3 ``delete_repository`` API operation.

.. exampleinclude:: /../../amazon/tests/system/amazon/aws/example_ecr.py
:language: python
:dedent: 4
:start-after: [START howto_operator_ecr_delete_repository]
:end-before: [END howto_operator_ecr_delete_repository]

Reference
---------

* `AWS Boto3 library documentation for ECR <https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ecr.html>`__
Comment thread
AlejandroMorgante marked this conversation as resolved.
5 changes: 5 additions & 0 deletions providers/amazon/provider.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,8 @@ integrations:
- integration-name: Amazon Elastic Container Registry (ECR)
external-doc-url: https://aws.amazon.com/ecr/
logo: /docs/integration-logos/Amazon-Elastic-Container-Registry_light-bg@4x.png
how-to-guide:
- /docs/apache-airflow-providers-amazon/operators/ecr.rst
tags: [aws]
- integration-name: Amazon ECS
external-doc-url: https://aws.amazon.com/ecs/
Expand Down Expand Up @@ -447,6 +449,9 @@ operators:
- integration-name: Amazon EC2
python-modules:
- airflow.providers.amazon.aws.operators.ec2
- integration-name: Amazon Elastic Container Registry (ECR)
python-modules:
- airflow.providers.amazon.aws.operators.ecr
- integration-name: Amazon ECS
python-modules:
- airflow.providers.amazon.aws.operators.ecs
Expand Down
231 changes: 231 additions & 0 deletions providers/amazon/src/airflow/providers/amazon/aws/operators/ecr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from __future__ import annotations

from collections.abc import Sequence
from typing import TYPE_CHECKING, Any, ClassVar

from airflow.providers.amazon.aws.hooks.ecr import EcrHook
from airflow.providers.amazon.aws.operators.base_aws import AwsBaseOperator
from airflow.providers.amazon.aws.utils.mixins import aws_template_fields
from airflow.utils.helpers import prune_dict

if TYPE_CHECKING:
from airflow.sdk import Context


class EcrCreateRepositoryOperator(AwsBaseOperator[EcrHook]):
"""
Create an Amazon ECR repository.

.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:EcrCreateRepositoryOperator`

:param repository_name: The name of the repository to create. (templated)
:param registry_id: The AWS account ID associated with the registry. (templated)
:param tags: Metadata to apply to the repository. (templated)
:param image_tag_mutability: The tag mutability setting for the repository. (templated)
:param image_tag_mutability_exclusion_filters: Filters that override the repository's
image tag mutability setting. (templated)
:param image_scanning_configuration: The image scanning configuration for the repository. (templated)
:param encryption_configuration: The encryption configuration for the repository. (templated)
:param aws_conn_id: The Airflow connection used for AWS credentials.
If this is ``None`` or empty then the default boto3 behaviour is used. If
running Airflow in a distributed manner and aws_conn_id is None or
empty, then default boto3 configuration would be used (and must be
maintained on each worker node).
:param region_name: AWS region_name. If not specified then the default boto3 behaviour is used.
:param verify: Whether or not to verify SSL certificates. See:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html
:param botocore_config: Configuration dictionary (key-values) for botocore client. See:
https://botocore.amazonaws.com/v1/documentation/api/latest/reference/config.html
Comment thread
AlejandroMorgante marked this conversation as resolved.
"""

aws_hook_class = EcrHook
template_fields: Sequence[str] = aws_template_fields(
"repository_name",
"registry_id",
"tags",
"image_tag_mutability",
"image_tag_mutability_exclusion_filters",
"image_scanning_configuration",
"encryption_configuration",
)
template_fields_renderers: ClassVar[dict[str, str]] = {
"tags": "json",
"image_tag_mutability_exclusion_filters": "json",
"image_scanning_configuration": "json",
"encryption_configuration": "json",
}

def __init__(
self,
*,
repository_name: str,
registry_id: str | None = None,
tags: list[dict[str, str]] | None = None,
image_tag_mutability: str | None = None,
image_tag_mutability_exclusion_filters: list[dict[str, str]] | None = None,
image_scanning_configuration: dict[str, bool] | None = None,
encryption_configuration: dict[str, str] | None = None,
aws_conn_id: str | None = "aws_default",
**kwargs,
):
super().__init__(aws_conn_id=aws_conn_id, **kwargs)
self.repository_name = repository_name
self.registry_id = registry_id
self.tags = tags
self.image_tag_mutability = image_tag_mutability
self.image_tag_mutability_exclusion_filters = image_tag_mutability_exclusion_filters
self.image_scanning_configuration = image_scanning_configuration
self.encryption_configuration = encryption_configuration

def execute(self, context: Context) -> dict[str, Any]:
self.log.info("Creating Amazon ECR repository %s", self.repository_name)
response = self.hook.conn.create_repository(
**prune_dict(
{
"registryId": self.registry_id,
"repositoryName": self.repository_name,
"tags": self.tags,
"imageTagMutability": self.image_tag_mutability,
"imageTagMutabilityExclusionFilters": self.image_tag_mutability_exclusion_filters,
"imageScanningConfiguration": self.image_scanning_configuration,
"encryptionConfiguration": self.encryption_configuration,
}
)
)
self.log.info("Created Amazon ECR repository %s", self.repository_name)
return response
Comment thread
AlejandroMorgante marked this conversation as resolved.


class EcrSetRepositoryPolicyOperator(AwsBaseOperator[EcrHook]):
"""
Set the repository policy for an Amazon ECR repository.

.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:EcrSetRepositoryPolicyOperator`

:param repository_name: The name of the repository to receive the policy. (templated)
:param policy_text: The JSON repository policy text to apply. (templated)
:param registry_id: The AWS account ID associated with the registry. (templated)
:param force: Whether to replace an existing policy that prevents setting a new policy. (templated)
:param aws_conn_id: The Airflow connection used for AWS credentials.
If this is ``None`` or empty then the default boto3 behaviour is used. If
running Airflow in a distributed manner and aws_conn_id is None or
empty, then default boto3 configuration would be used (and must be
maintained on each worker node).
:param region_name: AWS region_name. If not specified then the default boto3 behaviour is used.
:param verify: Whether or not to verify SSL certificates. See:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html
:param botocore_config: Configuration dictionary (key-values) for botocore client. See:
https://botocore.amazonaws.com/v1/documentation/api/latest/reference/config.html
"""

aws_hook_class = EcrHook
template_fields: Sequence[str] = aws_template_fields(
"repository_name", "policy_text", "registry_id", "force"
)
template_fields_renderers: ClassVar[dict[str, str]] = {"policy_text": "json"}

def __init__(
self,
*,
repository_name: str,
policy_text: str,
registry_id: str | None = None,
force: bool = False,
aws_conn_id: str | None = "aws_default",
**kwargs,
):
super().__init__(aws_conn_id=aws_conn_id, **kwargs)
self.repository_name = repository_name
self.policy_text = policy_text
self.registry_id = registry_id
self.force = force

def execute(self, context: Context) -> dict[str, Any]:
self.log.info("Setting repository policy for Amazon ECR repository %s", self.repository_name)
response = self.hook.conn.set_repository_policy(
**prune_dict(
{
"registryId": self.registry_id,
"repositoryName": self.repository_name,
"policyText": self.policy_text,
"force": self.force,
}
)
)
self.log.info("Set repository policy for Amazon ECR repository %s", self.repository_name)
return response


class EcrDeleteRepositoryOperator(AwsBaseOperator[EcrHook]):
"""
Delete an Amazon ECR repository.

.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:EcrDeleteRepositoryOperator`

:param repository_name: The name of the repository to delete. (templated)
:param registry_id: The AWS account ID associated with the registry. (templated)
:param force: Whether to delete the repository when it contains images. (templated)
:param aws_conn_id: The Airflow connection used for AWS credentials.
If this is ``None`` or empty then the default boto3 behaviour is used. If
running Airflow in a distributed manner and aws_conn_id is None or
empty, then default boto3 configuration would be used (and must be
maintained on each worker node).
:param region_name: AWS region_name. If not specified then the default boto3 behaviour is used.
:param verify: Whether or not to verify SSL certificates. See:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html
:param botocore_config: Configuration dictionary (key-values) for botocore client. See:
https://botocore.amazonaws.com/v1/documentation/api/latest/reference/config.html
"""

aws_hook_class = EcrHook
template_fields: Sequence[str] = aws_template_fields("repository_name", "registry_id", "force")

def __init__(
self,
*,
repository_name: str,
registry_id: str | None = None,
force: bool = False,
aws_conn_id: str | None = "aws_default",
**kwargs,
):
super().__init__(aws_conn_id=aws_conn_id, **kwargs)
self.repository_name = repository_name
self.registry_id = registry_id
self.force = force

def execute(self, context: Context) -> dict[str, Any]:
self.log.info("Deleting Amazon ECR repository %s", self.repository_name)
response = self.hook.conn.delete_repository(
**prune_dict(
{
"registryId": self.registry_id,
"repositoryName": self.repository_name,
"force": self.force,
}
)
)
self.log.info("Deleted Amazon ECR repository %s", self.repository_name)
return response
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ def get_provider_info():
"integration-name": "Amazon Elastic Container Registry (ECR)",
"external-doc-url": "https://aws.amazon.com/ecr/",
"logo": "/docs/integration-logos/Amazon-Elastic-Container-Registry_light-bg@4x.png",
"how-to-guide": ["/docs/apache-airflow-providers-amazon/operators/ecr.rst"],
"tags": ["aws"],
},
{
Expand Down Expand Up @@ -424,6 +425,10 @@ def get_provider_info():
"integration-name": "Amazon EC2",
"python-modules": ["airflow.providers.amazon.aws.operators.ec2"],
},
{
"integration-name": "Amazon Elastic Container Registry (ECR)",
"python-modules": ["airflow.providers.amazon.aws.operators.ecr"],
},
{
"integration-name": "Amazon ECS",
"python-modules": ["airflow.providers.amazon.aws.operators.ecs"],
Expand Down
Loading
Loading