Azure Data Factory で Execute Pipeline アクティビティを使用して呼び出し先の出力値を取得する方法

## 概要

Azure Data Factory にて Execute Pipeline アクティビティによる呼び出し先の出力値を取得する方法を共有します。変数の設定アクティビティのパイプラインの戻り値を設定することで、呼び出し元（Execute Pipeline アクティビティを含むパイプライン）でその値を利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f80a5d84-b759-f928-093c-db33d42cc5ec.png)

デバック実行した際などには出力される値が表示されませんが、パイプラインの戻り値で指定した名前を利用することで値を取得できました。

> @activity('Execute Pipeline1').output.pipelineReturnValue.message

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3152fb3b-61d9-1150-612a-b310147d3c3d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3b2a526f-3cc0-77dc-2369-68189c615e50.png)


## 検証手順

### 1. 子のパイプライン（Execute Pipeline アクティビティにより実行されるパイプライン）を作成

変数の設定アクティビティにてパイプラインの戻り値にて、 message という名前に出力したい値（例：失敗アクティビティの出力値）を設定。

<details>
  <summary>パイプライン定義</summary>
  
```json
{
    "name": "child_pipe",
    "properties": {
        "activities": [
            {
                "name": "Fail1",
                "type": "Fail",
                "dependsOn": [],
                "userProperties": [],
                "typeProperties": {
                    "message": {
                        "value": "\"エラーですよ\"",
                        "type": "Expression"
                    },
                    "errorCode": {
                        "value": "\"102\"",
                        "type": "Expression"
                    }
                }
            },
            {
                "name": "Set error_message_copy1",
                "type": "SetVariable",
                "dependsOn": [
                    {
                        "activity": "Fail1",
                        "dependencyConditions": [
                            "Completed"
                        ]
                    }
                ],
                "policy": {
                    "secureOutput": false,
                    "secureInput": false
                },
                "userProperties": [],
                "typeProperties": {
                    "variableName": "pipelineReturnValue",
                    "value": [
                        {
                            "key": "errorCode",
                            "value": {
                                "type": "Expression",
                                "content": "@activity('Fail1').output.errorCode"
                            }
                        },
                        {
                            "key": "message",
                            "value": {
                                "type": "Expression",
                                "content": "@activity('Fail1').output.message"
                            }
                        }
                    ],
                    "setSystemVariable": true
                }
            }
        ],
        "variables": {
            "error_code": {
                "type": "String"
            },
            "error_message": {
                "type": "String"
            }
        },
        "annotations": []
    }
}
```
  
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/cf03e92c-8f84-8347-342a-d9160c1b1e5a.png)

### 2. 親のパイプライン（Execute Pipeline アクティビティを含むパイプライン）を作成

変数の設定アクティビティにて下記の式を設定。

> @activity('Execute Pipeline1').output.pipelineReturnValue.message

<details>
  <summary>パイプライン定義</summary>
  
```json
{
    "name": "parent_pipe",
    "properties": {
        "activities": [
            {
                "name": "Execute Pipeline1",
                "type": "ExecutePipeline",
                "dependsOn": [],
                "policy": {
                    "secureInput": false
                },
                "userProperties": [],
                "typeProperties": {
                    "pipeline": {
                        "referenceName": "child_pipe",
                        "type": "PipelineReference"
                    },
                    "waitOnCompletion": true
                }
            },
            {
                "name": "Set variable1",
                "type": "SetVariable",
                "dependsOn": [
                    {
                        "activity": "Execute Pipeline1",
                        "dependencyConditions": [
                            "Succeeded"
                        ]
                    }
                ],
                "policy": {
                    "secureOutput": false,
                    "secureInput": false
                },
                "userProperties": [],
                "typeProperties": {
                    "variableName": "test",
                    "value": {
                        "value": "@activity('Execute Pipeline1').output.pipelineReturnValue.message",
                        "type": "Expression"
                    }
                }
            }
        ],
        "variables": {
            "test": {
                "type": "String"
            }
        },
        "annotations": []
    }
}
```
  
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/709880d6-c561-1f3f-7454-0a42cc414a6c.png)


### 3. デバック実行し正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e9e55f66-5c9b-057f-7e72-91916a05d500.png)