EC2のLifecyclePolicyでCrossRegionCopyRules設定につまずいた話  


以下2点について備忘録に残したく不定期ながら投稿していこうと思います
 * Docや過去記事どおりに解決できなかったこと(はまったポイント)
 * 自分の開発のポイント

投稿初回お見苦しい点ありましたらご容赦ください  

## 記事の内容  

EC2のライフサイクルポリシーをCloudFormationで作成する際に、公式ドキュメント推奨のTargetではCrossRegionCopyRulesが設定出来ず、非推奨のTargetRegionでdeployした記録です

buildとdeployにsam cliを使いました  

[ライフサイクルポリシー公式Doc](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-targetregion)  


## 作業環境  
 * Windows10 / WSL2(Ubuntu20.04)  
 * aws-cli/1.22.92 Python/3.8.10 Linux/5.13.0-1021-aws botocore/1.24.37  
 * SAM CLI, version 1.46.0  

## やりたかったこと  
EC2の運用手間を減らすため初めからAMIバックアップの自動化を試みました

AMIの自動バックアップは**Data Lifecycle Managerのポリシータイプ**で **EBS-backed AMI ポリシー** を選ぶと可能です  

動作確認でこちらを参考にさせて頂きました  
[Amazon Data Lifecycle Manager でクロスアカウントのスナップショットコピーを設定](https://blog.serverworks.co.jp/2021/11/05/131258)  

## template.yaml  

動作の確認後にAWS公式Docのtemplateを参考にtemplate.yamlを作りました
[公式Doc sample template](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-dlm-lifecyclepolicy.html)  

ここで[AWS::DLM::LifecyclePolicy CrossRegionCopyRule](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-targetregion)を見ると**CrossRegion設定にはTargetを推奨**しているようです  
>Target
>
>The target Region or the Amazon Resource Name (ARN) of the target Outpost for the snapshot copies.
>Use this parameter instead of TargetRegion. Do not specify both.
>
>
>TargetRegion
>
>Avoid using this parameter when creating new policies. Instead, use Target to specify a target Region or a target Outpost for snapshot copies.
>For policies created before the Target parameter was introduced, this parameter indicates the target Region for snapshot copies.

推奨に従いTargetでus-east-1を指定します

<img width= 300 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/120e7a3a-06fb-c183-bdc8-8e5c70bab390.png>

```template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  SAM Template DLM Cross Reasion seting for EC2_K

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------# 
Parameters:
  ProjectName:
    Type: String
    Default: EC2-K
  TargetRegion:
    Type: String
    Default: us-east-1

Resources:
# ------------------------------------------------------------#
# AMI Backup Cycle Policy
# ------------------------------------------------------------#    
  EC2LifiCyclePolicy:
    Type: AWS::DLM::LifecyclePolicy
    Properties:
      Description: Lifecycle Policy using CloudFormation
      State: ENABLED
      ExecutionRoleArn: !Sub arn:aws:iam::${AWS::AccountId}:role/service-role/AWSDataLifecycleManagerDefaultRoleForAMIManagement
      PolicyDetails:
        ResourceTypes:
        - INSTANCE
        PolicyType: IMAGE_MANAGEMENT
        TargetTags:
        - Key: AMI_DLM
          Value: 'on'
        Schedules:
        - Name: !Sub Daily Backup ${ProjectName} AMI
          CreateRule:
            Interval: 24
            IntervalUnit: HOURS
            Times:
            - '17:00'
          RetainRule:
            Count: 7
          CopyTags: true
          CrossRegionCopyRules:
          - Encrypted: True
            Target: !Sub ${TargetRegion}
            RetainRule:
              Interval: 1
              IntervalUnit: DAYS
            CopyTags: True
```

## Deploy

```
$ sam build
$ sam deploy --guided
```
するとdeploy中にerrorが発生します  

>	The following parameters(s) are invalid: {Target} (Service: AmazonDLM; Status Code: 400; Error Code: InvalidRequestException; Request ID: 1bbbb8d6-e794-4aef-9002-ccb893ebab6e; Proxy: null)

## 対策

**Targetを非推奨のTargetRegionに変更**することで**deployが可能**でした(実際には余計な紆余曲折がありましたが割愛します)  

```yaml:変更前
Target: !Sub ${TargetRegion}
```

```yaml:変更後
TargetRegion: !Sub ${TargetRegion}
```

## まとめ
CloudFormationでDLMのCrossRegionCopyRuleのregion設定するにはTargetRegionを使う必要がありました(2022.4.14時点)

素直に非推奨も試せばよかったのですが裏読みして少し時間を溶かしたので自戒を込めて記録します