CloudFormationでCloudFront Functionsデプロイ時にInternalFailureが発生する


## 発生事象
CloudFormation で CloudFront Functions をデプロイする際に InternalFailure が発生してしまう。

```
Resource handler returned message: "null" (RequestToken: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, HandlerErrorCode: InternalFailure)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/d321bc62-ade4-a4a8-2691-d52cc0d703e1.png)


## 使用したテンプレート
https://github.com/aws-samples/amazon-cloudfront-functions/blob/main/add-security-headers/index.js

上記を参考にこんな感じのテンプレートを使いました。

```template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: add-security-headers-cloudfront-function

Resources:
  AddSecurityHeaderFunction:
    Type: AWS::CloudFront::Function
    Properties: 
      AutoPublish: false 
      FunctionCode: |
        function handler(event) {
            var response = event.response;
            var headers = response.headers;
            headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; 
            headers['content-security-policy'] = { value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}; 
            headers['x-content-type-options'] = { value: 'nosniff'}; 
            headers['x-frame-options'] = {value: 'DENY'}; 
            headers['x-xss-protection'] = {value: '1; mode=block'}; 
            
            return response;
        }
      Name: add-security-headers-cff
```

## 回避策
[FunctionConfig](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-function-functionconfig.html) プロパティを追加すると回避できます。

```yaml
      FunctionConfig:
        Comment: add-security-headers-cff
        Runtime: cloudfront-js-1.0
```
Comment は任意のコメントを記載。Runtime は CloudFront Functions のランタイム環境を指定するが、今のところ `cloudfront-js-1.0` のみ有効。

## 原因
2021/6/4 現在で CloudFormation のユーザーガイドには FunctionConfig プロパティは `Required: No` と記載されていますが、プロパティを省略すると InternalFailure でデプロイが失敗してしまいます。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-function.html#aws-resource-cloudfront-function-properties

CloudFormation の不具合なのかドキュメントの記載ミスなのかは判断できませんので、事象が解消されたことを確認したら追記したいと思います。

## 対応後
デプロイ成功!!

```template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: add-security-headers-cloudfront-function

Resources:
  AddSecurityHeaderFunction:
    Type: AWS::CloudFront::Function
    Properties: 
      AutoPublish: false 
      FunctionConfig:
        Comment: add-security-headers-cff
        Runtime: cloudfront-js-1.0
      FunctionCode: |
        function handler(event) {
            var response = event.response;
            var headers = response.headers;
            headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; 
            headers['content-security-policy'] = { value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}; 
            headers['x-content-type-options'] = { value: 'nosniff'}; 
            headers['x-frame-options'] = {value: 'DENY'}; 
            headers['x-xss-protection'] = {value: '1; mode=block'}; 

            return response;
        }
      Name: add-security-headers-cff
```



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/d805a997-764b-7ef3-6133-b04f4a8e49e8.png)