CloudFormationでHostedZoneIdを設定してるのに「Property HostedZoneId cannot be empty.」と言われた時

本題

標題の通りですが、AWSのCloudFormationのテンプレートで、でHostedZoneIdを設定してるのに「Property HostedZoneId cannot be empty.」とエラーが出てしまい、原因が分からずしばらくハマリました。

確かにHostedZoneIdは設定したはずなのに…。

  DnsRecord: 
    Type: "AWS::Route53::RecordSet"
    Properties:
      HostedZoneId: XYZ1234ABCD  # ←Emptyじゃないよね!
      Name: hoge.fuga.co.jp
      Type: A
      AliasTarget:
        DNSName: xxxxxx.ap-northeast-1.elb.amazonaws.com

なんの事は無い、AliasTargetの方のHostedZoneIdが抜けていたのでした。

  DnsRecord: 
    Type: "AWS::Route53::RecordSet"
    Properties:
      HostedZoneId: XYZ1234ABCD
      Name: hoge.fuga.co.jp
      Type: A
      AliasTarget:
        HostedZoneId: YSHDK1233P # ←こっちです、抜けてたのは!
        DNSName: xxxxxx.ap-northeast-1.elb.amazonaws.com

もし同じミスでハマった人の手助けになればと思った次第です。

続きを読む

AWS-SDK & nodejs メモ

はじめに

自分用のメモ代わりです。すみません。
nodejsでaws-sdkの各種機能を適当にメモっていきます。

共通処理

aws-sdkを読み込み、リージョンとプロファイルを設定

const aws = require('aws-sdk');

var credentials = new aws.SharedIniFileCredentials({
    profile: "<プロフィル名>"
});
aws.config.update({
    region: "<リージョン名>",
    credentials: credentials
});

S3

ローカルファイルをS3にアップロード

const s3 = new aws.S3();

const params = {
    Bucket: "<バケット名>",
    Key: "<キー名>",
    Body: fs.createReadStream("<ローカルファイルのパス>"),
};

s3.upload(params).promise()
.then(function(data) {
    console.log(`アップロード成功: s3://${data.Bucket}/${data.Key}`);
})
.catch(function(err){
    console.dir(err);
});

続きを読む

CloudFormerのちょっとした落とし穴

はじめに

同じ内容で2回もハマってしまったのでメモ。

CloudFormerで既存のAWS構成をテンプレートに落とした時、CloudFormationの構文エラーになるJSONが吐かれる事があるという話です。

本題

文字列の配列でなければならないプロパティーが、単一の文字列になってしまいます。

CloudFormerの出力
{
    "s3policyxxxbucket": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {
          "Ref": "s3xxxbucket"
        },
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Id": "Policy-xxx",
          "Statement": [
            {
              "Sid": "xxxxxxxxxxxx",
              "Effect": "Allow",
              "Principal": "*",
              "Action": "s3:GetObject",
              "Resource": "<省略>",
              "Condition": {
                "IpAddress": {
                  "aws:SourceIp": "0.0.0.0/0"
                }
              }
            }
          ]
        }
      }
    }
}

上記の"Action": "s3:GetObject"が問題で、正しくは"Action": [ "s3:GetObject" ]です。

最後に

CloudFormerで既存のAWS構成をテンプレートに落とすことが出来るのは便利ですが、それを使う時にはちょっと注意が必要ですね。

それと、CloudFormationのエラー出力がもう少し情報を出してくれれば..と思います。今回もInvalid Resource ...ぐらいしか言ってくれなかったので、他の箇所を疑ってしまい、解決するまでに時間を浪費しました。

とは言え、CloudFormerの出力はそのまま使うなと公式にも注意書きしてあった気がするので、よく確認しなかった自分が悪いのですが。

続きを読む